Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
themeRDark
encoder_priority=OPENH264
mixer_video_bitrate_kbps=5000

Уменьшение границ между картинками отдельных потоков (zero padding)

В некоторых случаях, необходимо обеспечить минимальное расстояние между картинками отдельных потоков в микшере. Для этого используется настройка в файле flashphoner.properties

...

Управление звуковой дорожкой выходного потока микшера

По умолчанию, звуковая дорожка в выходном потоке микшера кодируется в Opus с частотой дискретизации 48 кГц. Эти параметры могут быть изменены при помощи настроек в файле flashphoner.properties. Например, для использования выходного потока в SIP, можно установить следующие значения:

Code Block
themeRDark
audio_mixer_use_center_no_padding_layout=true_output_codec=pcma
audio_mixer_output_sample_rate=8000

В этом случае картинки располагаются в выходном потоке микшера максимально близко друг от друга:

Image Removed

Эта возможность обеспечивается только для входных потоков одинакового разрешения, с одинаковым соотношением сторон.

Управление звуковой дорожкой выходного потока микшера

По умолчанию, звуковая дорожка в выходном потоке микшера кодируется в Opus с частотой дискретизации 48 кГц. Эти параметры могут быть изменены при помощи настроек в файле flashphoner.properties. Например, для использования выходного потока в SIP, можно установить следующие значения:звук будет кодироваться в PCMA (alaw) с частотой дискретизации 8 кГц.

Собственный losless видеопроцессор для входящих потоков

Для обработки входящих потоков микшера, например, если необходима дополнительная буферизация или синхронизация аудио и видео дорожек, может быть использован собственный losless видеопроцессор. Этот видеопроцессор включается настройкой в файле flashphoner.properties

Code Block
themeRDark
audio_mixer_output_codec=pcma
audio_mixer_output_sample_rate=8000

В этом случае звук будет кодироваться в PCMA (alaw) с частотой дискретизации 8 кГц.

Собственный losless видеопроцессор для входящих потоков

...

lossless_video_processor_enabled=true

Максимальный размер буфера микшера в миллисекундах устанавливается настройкой

Code Block
themeRDark
mixer_lossless_video_processor_max_mixer_buffer_size_ms=200

По умолчанию, размер буфера микшера составляет 200 мс. При его заполнении, видеопроцессор использует свой собственный буфер и ожидает освобождения буфера микшера. Периодичность проверки буфера микшера устанавливается в миллисекундах настройкой

Code Block
themeRDark
mixer_lossless_video_processor_wait_time_enabledms=true

Максимальный размер буфера микшера в миллисекундах устанавливается настройкой

Code Block
themeRDark
mixer_lossless_video_processor_max_mixer_buffer_size_ms=200

По умолчанию, размер буфера микшера составляет 200 мс. При его заполнении, видеопроцессор использует свой собственный буфер и ожидает освобождения буфера микшера. Периодичность проверки буфера микшера устанавливается в миллисекундах настройкой

Code Block
themeRDark
mixer_lossless_video_processor_wait_time_ms=20

По умолчанию, периодичность проверки составляет 20 мс.

...

20

По умолчанию, периодичность проверки составляет 20 мс.

Необходимо отметить, что использование losless видеопроцессора может вносить задержку в трансляции в реальном времени.

При использовании losless видеопроцессора, чтобы освободить ресурсы, занятые микшером, нужно принудительно остановить микшер при помощи REST запроса /mixer/terminate, либо остановить все входящие в микшер потоки, в этом случае микшер остановится по истечении времени, заданного в миллисекундах настройкойистечении времени, заданного в миллисекундах настройкой

Code Block
themeRDark
mixer_activity_timer_timeout=60000

По умолчанию, при отсутствии входящих потоков, микшер останавливается через 60 секунд.

Управление размещением картинок в выходном потоке микшера

По умолчанию, микшер предусматривает три варианта размещения картинок входных потоков в выходном потоке:

1. Картинки сеткой

Image Added

Этот вариант включается настройкой в файле flashphoner.properties

Code Block
themeRDark
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.GridLayout

2. Картинки сеткой с минимальным расстоянием между ними

Image Added

Этот вариант включается настройкой

Code Block
themeRDark
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.CenterNoPaddingGridLayout

и обеспечивается только для входных потоков одинакового разрешения, с одинаковым соотношением сторон


3. Демонстрация экрана (screen sharing) в центре кадра

Image Added

Этот вариант включается, если на вход микшеру подается поток с именем, указанным в настройке

Code Block
themeRDark
mixer_video_layout_desktop_key_word=desktop

По умолчанию, для потока демонстрации экрана используется имя desktop.

Реализация собственного варианта размещения картинок

Для более тонкой настройки размещения картинок в выходном потоке микшера необходимо разработать класс на языке Java, реализующий интерфейс IVideoMixerLayout, например

Code Block
languagejava
themeRDark
titleTestLayout.java
package com.flashphoner.mixerlayout;

import com.flashphoner.media.mixer.video.presentation.Box;
import com.flashphoner.media.mixer.video.presentation.BoxPosition;
import com.flashphoner.media.mixer.video.presentation.VideoLayout;
import com.flashphoner.sdk.media.IVideoMixerLayout;
import com.flashphoner.sdk.media.YUVFrame;
import java.util.ArrayList;

public class TestLayout extends VideoLayout {

    private static final int PADDING = 5;

    @Override
    public Layout[] compute(YUVFrame[] frames, int canvasWidth, int canvasHeight) {
        return computeGrid(frames, canvasWidth, canvasHeight);
    }

    private IVideoMixerLayout.Layout[] computeGrid(YUVFrame[] frames, int canvasWidth, int canvasHeight) {
        Box mainBox = new Box(null, canvasWidth, canvasHeight);
        for (int i = 0; i < frames.length; i++) {
            Box frameBox = new Box(mainBox, canvasWidth/frames.length, canvasHeight/frames.length);
            frameBox.setPosition(BoxPosition.INLINE_HORIZONTAL_CENTER);
            frameBox.setPaddingLeft(PADDING);
            frameBox.setPaddingRight(PADDING);
            Box frame = new Box(frameBox, frames[i]);
            frame.setPosition(BoxPosition.INLINE_HORIZONTAL);
            frame.fillParent();
        }
        ArrayList<IVideoMixerLayout.Layout> layout = new ArrayList<>();
        mainBox.computeLayout(layout);
        return layout.toArray(new IVideoMixerLayout.Layout[layout.size()]);
    }

}

Затем следует скомпилировать класс в байт-код. Для этого создаем дерево каталогов, соответствующее названию пакета написанного класса (com/flashphoner/mixerlayout)

Code Block
languagebash
themeRDark
mkdir -p com/flashphoner/mixerlayout

и выполняем команду

Code Block
languagebash
themeRDark
javac -cp /usr/local/FlashphonerWebCallServer/lib/tbs-flashphoner.jar ./com/flashphoner/mixerlayout/TestLayout.java

Теперь упакуем скомпилированный код в jar-файл

Code Block
languagebash
themeRDark
jar -cf testlayout.jar ./com/flashphoner/mixerlayout/TestLayout.class

и скопируем его в каталог, где размещены библиотеки WCS сервера

Code Block
languagebash
themeRDark
cp testlayout.jar /usr/local/FlashphonerWebCallServer/lib

Для того, чтобы использовать разработанный класс, необходимо указать его в настройке в файле flashphoner.properties

Code Block
themeRDark
mixer_activitylayout_timer_timeout=60000

...

class=com.flashphoner.mixerlayout.TestLayout

и перезапустить WCS.

Выходной поток микшера для приведенного примера и трех входящих потоков будет выглядеть так:

Image Added

Краткое руководство по тестированию

...