...
Если в качестве транскодера используется кодек OpenH264, появляется возможность управлять битрейтом выходного потока микшера при помощи настройки в файле flashphoner.properties
Code Block | ||||
---|---|---|---|---|
| ||||
mixer_video_bitrate_kbps=2000 |
По умолчанию, битрейт выходного потока установлен в 2 Мбит/с. При недостаточной пропускной способности канала между сервером и зрителем битрейт может быть понижен, например
Code Block | language | bash|
---|---|---|
| ||
encoder_priority=OPENH264 mixer_video_bitrate_kbps=1500 |
Если качество картинки с битрейтом по умолчанию низкое, присутствуют искажения, рекомендуется увеличить битрейт выходного потока микшера до 3-5 Мбит/с
Code Block | ||||
---|---|---|---|---|
| ||||
encoder_priority=OPENH264 mixer_video_bitrate_kbps=5000 |
Уменьшение границ между картинками отдельных потоков (zero padding)
В некоторых случаях, необходимо обеспечить минимальное расстояние между картинками отдельных потоков в микшере. Для этого используется настройка в файле flashphoner.properties
Code Block | ||||
---|---|---|---|---|
| ||||
mixer_use_center_no_padding_layout=true |
В этом случае картинки располагаются в выходном потоке микшера максимально близко друг от друга:
Эта возможность обеспечивается только для входных потоков одинакового разрешения, с одинаковым соотношением сторон.
Управление звуковой дорожкой выходного потока микшера
По умолчанию, звуковая дорожка в выходном потоке микшера кодируется в Opus с частотой дискретизации 48 кГц. Эти параметры могут быть изменены при помощи настроек в файле flashphoner.properties. Например, для использования выходного потока в SIP, можно установить следующие значения:
Code Block | ||||
---|---|---|---|---|
| ||||
audio_mixer_output_codec=pcma
audio_mixer_output_sample_rate=8000 |
В этом случае звук будет кодироваться в PCMA (alaw) с частотой дискретизации 8 кГц.
Собственный losless видеопроцессор для входящих потоков
Для обработки входящих потоков микшера, например, если необходима дополнительная буферизация или синхронизация аудио и видео дорожек, может быть использован собственный losless видеопроцессор. Этот видеопроцессор включается настройкой в файле flashphoner.properties
...
Управление звуковой дорожкой выходного потока микшера
По умолчанию, звуковая дорожка в выходном потоке микшера кодируется в Opus с частотой дискретизации 48 кГц. Эти параметры могут быть изменены при помощи настроек в файле flashphoner.properties. Например, для использования выходного потока в SIP, можно установить следующие значения:
Code Block | ||
---|---|---|
| ||
audio_mixer_output_codec=pcma
audio_mixer_output_sample_rate=8000 |
В этом случае звук будет кодироваться в PCMA (alaw) с частотой дискретизации 8 кГц.
Собственный lossless видеопроцессор для входящих потоков
Для обработки входящих потоков микшера, например, если необходима дополнительная буферизация или синхронизация аудио и видео дорожек, может быть использован собственный lossless видеопроцессор. Этот видеопроцессор включается настройкой в файле flashphoner.properties
Code Block | ||
---|---|---|
| ||
mixer_lossless_video_processor_enabled=true |
Максимальный размер буфера микшера в миллисекундах устанавливается настройкой
Code Block | ||
---|---|---|
| ||
mixer_lossless_video_processor_max_mixer_buffer_size_ms=200 |
По умолчанию, размер буфера микшера составляет 200 мс. При его заполнении, видеопроцессор использует свой собственный буфер и ожидает освобождения буфера микшера. Периодичность проверки буфера микшера устанавливается в миллисекундах настройкой
Code Block | ||
---|---|---|
| ||
mixer_lossless_video_processor_enabled=true |
Максимальный размер буфера микшера в миллисекундах устанавливается настройкой
Code Block | ||||
---|---|---|---|---|
| ||||
mixer_lossless_video_processor_max_mixer_buffer_size_ms=200wait_time_ms=20 |
По умолчанию, размер буфера микшера составляет 200 мс. При его заполнении, видеопроцессор использует свой собственный буфер и ожидает освобождения буфера микшера. Периодичность проверки буфера микшера устанавливается в миллисекундах настройкойпериодичность проверки составляет 20 мс.
Необходимо отметить, что использование lossless видеопроцессора может вносить задержку в трансляции в реальном времени.
При использовании lossless видеопроцессора, чтобы освободить ресурсы, занятые микшером, нужно принудительно остановить микшер при помощи REST запроса /mixer/terminate, либо остановить все входящие в микшер потоки, в этом случае микшер остановится по истечении времени, заданного в миллисекундах настройкой
Code Block | ||
---|---|---|
| ||
mixer_idle_timeout=60000 |
По умолчанию, при отсутствии входящих потоков, микшер останавливается через 60 секунд.
Управление размещением картинок в выходном потоке микшера
По умолчанию, микшер предусматривает три варианта размещения картинок входных потоков в выходном потоке:
1. Картинки сеткой
Этот вариант включается настройкой в файле flashphoner.properties
Code Block | ||
---|---|---|
| ||
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.GridLayout |
2. Картинки сеткой с минимальным расстоянием между ними
Этот вариант включается настройкой
Code Block | ||
---|---|---|
| ||
mixer_layout_class=com.flashphoner.media.mixer.video.presentation.CenterNoPaddingGridLayout |
и обеспечивается только для входных потоков одинакового разрешения, с одинаковым соотношением сторон
3. Демонстрация экрана (screen sharing) в центре кадра
Этот вариант включается, если на вход микшеру подается поток с именем, указанным в настройке
Code Block | ||
---|---|---|
| ||
mixer_video_layout_desktop_key_word=desktop |
По умолчанию, для потока демонстрации экрана используется имя desktop.
Реализация собственного варианта размещения картинок
Для более тонкой настройки размещения картинок в выходном потоке микшера необходимо разработать класс на языке Java, реализующий интерфейс IVideoMixerLayout, например
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package com.flashphoner.mixerlayout;
import com.flashphoner.sdk.media.IVideoMixerLayout;
import com.flashphoner.sdk.media.YUVFrame;
import java.awt.*;
import java.util.ArrayList;
public class TestLayout implements IVideoMixerLayout {
private static final int PADDING = 5;
@Override
public Layout[] computeLayout(YUVFrame[] yuvFrames, String[] strings, int canvasWidth, int canvasHeight) {
ArrayList<IVideoMixerLayout.Layout> layout = new ArrayList<>();
for (int c = 0; c < yuvFrames.length; c++) {
Point prevPoint = new Point();
Dimension prevDimension = new Dimension(canvasWidth, canvasHeight);
if (layout.size() > 0) {
prevPoint.setLocation(layout.get(c-1).getPoint());
prevDimension.setSize(layout.get(c-1).getDimension());
}
Point currentPoint = new Point((int) (prevPoint.getX()+prevDimension.getWidth()+PADDING),
(int)(prevPoint.getY()+prevDimension.getHeight()));
layout.add(new IVideoMixerLayout.Layout(currentPoint, new Dimension(canvasWidth/yuvFrames.length,
canvasHeight/yuvFrames.length), yuvFrames[c]));
}
return layout.toArray(new IVideoMixerLayout.Layout[layout.size()]);
}
} |
Затем следует скомпилировать класс в байт-код. Для этого создаем дерево каталогов, соответствующее названию пакета написанного класса
Code Block | ||||
---|---|---|---|---|
| ||||
mkdir -p com/flashphoner/mixerlayout |
и выполняем команду
Code Block | ||||
---|---|---|---|---|
| ||||
javac -cp /usr/local/FlashphonerWebCallServer/lib/tbs-flashphoner.jar ./com/flashphoner/mixerlayout/TestLayout.java |
Теперь упакуем скомпилированный код в jar-файл
Code Block | ||||
---|---|---|---|---|
| ||||
jar -cf testlayout.jar ./com/flashphoner/mixerlayout/TestLayout.class |
и скопируем его в каталог, где размещены библиотеки WCS сервера
Code Block | ||||
---|---|---|---|---|
| ||||
mixer_lossless_video_processor_wait_time_ms=20 |
По умолчанию, периодичность проверки составляет 20 мс.
...
cp testlayout.jar /usr/local/FlashphonerWebCallServer/lib |
Для того, чтобы использовать разработанный класс, необходимо указать его в настройке в файле flashphoner.properties
Code Block | ||
---|---|---|
| ||
mixer_layout_class=com.flashphoner.mixerlayout.TestLayout |
и перезапустить WCS.
Выходной поток микшера для приведенного примера и трех входящих потоков будет выглядеть так:
Краткое руководство по тестированию
...