Поддерживаемые кодеки
Видео:
- H264
- VP8
- H265 (начиная со сборки 5.2.1803)
Аудио:
- Opus
- AAC
- G711 (PCMA, PCMU)
- G722
В каких случаях включается транскодинг
...
При этом поток будет транскодирован к тем ширине и высоте кадра, которые запрашивает подписчик. Если высота не указана подписчиком, будет установлена высота картинки 120. Если ширина не указана подписчиком, будет установлена ширина картинки 160.
Синхронизация аудио и видео на выходе транскодера
...
Округление ширины картинки при сохранении соотношения сторон
В сборке 5.2.1842 добавлена возможность указать округление ширины картинки при включенном сохранении соотношения сторон. По умолчанию, ширина округляется в меньшую сторону:
Code Block |
---|
|
avvideo_transcoder_pacedround_senderratio=true |
...
Например, при транскодировании картинки 1280x720 к разрешению 480p по умолчанию будет получена картинка 852x480. Настройка
Code Block |
---|
|
avvideo_pacedtranscoder_sender_max_buffer_size=5000 |
По умолчанию размер буфера составляет 5000 кадров
Для контроля работы выравнивающего буфера используется статистика, получаемая при помощи запроса
Code Block |
---|
|
curl -s 'http://localhost:8081/?action=stat&format=json&groups=buffer_stats' |
Добавление водяного знака в определенный поток
В сборке 5.2.693 появилась возможность добавлять в выходной поток транскодера водяной знак при создании транскодера по REST API, например
Code Block |
---|
|
{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "Test.png"
}
} |
Если имя файла указано без пути, файл должен располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf. Можно также указать полный путь к файлу, например
Code Block |
---|
|
{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "/opt/media/Test.png"
}
} |
Динамическое добавление и изменение водяного знака
В сборке 5.2.1349 добавлена возможность динамически добавлять и изменять водяной знак, не останавливая транскодер. Водяной знак может быть добавлен, изменен или перемещен в соответствии с указанными координатами при помощи REST API запроса /transcoder2/set_watermark
Code Block |
---|
|
{
"uri":"transcoder2://tcode1",
"watermark":"/opt/media/logo.png",
"x":10,
"y":10,
"marginTop":5,
"marginLeft":5,
"marginBottom":5,
"marginRight":5
} |
Здесь
- watermark - имя файла водяного знака
- x, y - координаты верхнего левого угла водяного знака на картинке потока
- marginTop, marginLeft, marginBottom, marginRignt - отступы от границ картинке потока
Если координаты выходят за границы картинки потока, водяной знак будет вписан в эти границы с учетом отступов.
Для того, чтобы переместить водяной знак в другое место на картинке, необходимо отправить запрос с тем же файлом, но новыми координатами. Чтобы убрать водяной знак с картинки, необходимо отправить запрос с пустым полем watermark
Code Block |
---|
|
{
"uri":"transcoder2://tcode1",
"watermark":""
} |
Многопоточное кодирование
В сборке 5.2.816 добавлена возможность многопоточного кодирования при использовании кодировщика на базе OpenH264. Количество потоков кодирования устанавливается следующей настройкой
Code Block |
---|
|
video_encoder_max_threads=2 |
По умолчанию, количество потоков установлено в 2.
Многопоточное кодирование включается в зависимости от разрешения выходного потока транскодера. Граница устанавливается при помощи следующей настройки
Code Block |
---|
|
video_encoder_second_thread_threshold=777000 |
Значение представляет собой произведение ширины картинки на высоту. Таким образом, по умолчанию в несколько потоков кодируются картинки разрешением 720p. При необходимости, этот порог можно понизить. Например, для того, чтобы кодировать в несколько потоков картинки 480p, установите значение
Code Block |
---|
|
video_encoder_second_thread_threshold=408950round_ratio=1 |
включает округление в большую сторону: в этом случае будет получена картинка 854x480.
Соотношение сторон для вертикального видео
Начиная со сборки 5.2.1911, WCS определяет ориентацию публикуемого потока по ширине и высоте кадра и поддерживает соотношение сторон следующим образом:
1. Для горизонтального видео (ширина картинки больше либо равна высоте) значение height
из профиля транскодирования применяется к высоте, ширина транскодируемого потока вычисляется по высоте. Например, для потока 1920x1080 (16:9) при заказанном транскодинге с height: 360
результат будет иметь разрешение 640x360.
2. Для вертикального видео (ширина картинки меньше высоты) значение height
из профиля транскодирования применяется к ширине, высота транскодируемого потока вычисляется по ширине. Например, для потока 1080x1920 (9:16) при заказанном транскодинге с height: 360
результат будет иметь разрешение 360x640.
Синхронизация аудио и видео на выходе транскодера
По умолчанию, транскодер не синхронизирует аудио и видео в выходном потоке, оставляя значение синхронизации как есть. Это может приводить к несовпадению звука и видео в транскодированном потоке. Чтобы этого избежать, в сборке 5.2.543 добавлен выравнивающий буфер, который включается настройкой
Code Block |
---|
|
av_paced_sender=true |
Размер выравнивающего буфера задается в кадрах настройкой
Code Block |
---|
|
av_paced_sender_max_buffer_size=5000 |
По умолчанию размер буфера составляет 5000 кадров
Для контроля работы выравнивающего буфера используется статистика, получаемая при помощи запроса
Code Block |
---|
|
curl -s 'http://localhost:8081/?action=stat&format=json&groups=buffer_stats' |
Добавление водяного знака в определенный поток
В сборке 5.2.693 появилась возможность добавлять в выходной поток транскодера водяной знак при создании транскодера по REST API, например
Code Block |
---|
|
{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "Test.png"
}
} |
Если имя файла указано без пути, файл должен располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf. Можно также указать полный путь к файлу, например
Code Block |
---|
|
{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "/opt/media/Test.png"
}
} |
Динамическое добавление и изменение водяного знака
В сборке 5.2.1349 добавлена возможность динамически добавлять и изменять водяной знак, не останавливая транскодер. Водяной знак может быть добавлен, изменен или перемещен в соответствии с указанными координатами при помощи REST API запроса /transcoder2/set_watermark
Code Block |
---|
|
{
"uri":"transcoder2://tcode1",
"watermark":"/opt/media/logo.png",
"x":10,
"y":10,
"marginTop":5,
"marginLeft":5,
"marginBottom":5,
"marginRight":5
} |
Здесь
- watermark - имя файла водяного знака
- x, y - координаты верхнего левого угла водяного знака на картинке потока
- marginTop, marginLeft, marginBottom, marginRignt - отступы от границ картинки потока
Если координаты выходят за границы картинки потока, водяной знак будет вписан в эти границы с учетом отступов.
Для того, чтобы переместить водяной знак в другое место на картинке, необходимо отправить запрос с тем же файлом, но новыми координатами. Чтобы убрать водяной знак с картинки, необходимо отправить запрос с пустым полем watermark
Code Block |
---|
|
{
"uri":"transcoder2://tcode1",
"watermark":""
} |
Многопоточное кодирование
В сборке 5.2.816 добавлена возможность многопоточного кодирования при использовании кодировщика на базе OpenH264. Количество потоков кодирования устанавливается следующей настройкой
Code Block |
---|
|
video_encoder_max_threads=2 |
По умолчанию, количество потоков установлено в 2.
Многопоточное кодирование включается в зависимости от разрешения выходного потока транскодера. Граница устанавливается при помощи следующей настройки
Code Block |
---|
|
video_encoder_second_thread_threshold=777000 |
Значение представляет собой произведение ширины картинки на высоту. Таким образом, по умолчанию в несколько потоков кодируются картинки разрешением 720p. При необходимости, этот порог можно понизить. Например, для того, чтобы кодировать в несколько потоков картинки 480p, установите значение
Code Block |
---|
|
video_encoder_second_thread_threshold=408950 |
Определение индентификатора профиля кодирования H264
В сборке 5.2.1644 добавлен инструмент, при помощи которого можно определить идентификатор профиля кодирования H264 по параметрам кодирования:
Code Block |
---|
|
sudo bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --config=codec,resolution,profile,level[,preset] |
Здесь
codec
- наименование кодировщика: OPENH264
или FF
resolution
- разрешениеprofile
- профиль кодированияlevel
- уровень кодированияpreset
- набор настроек кодировщика
Например, для следующих параметров
Code Block |
---|
|
sudo bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --config="OPENH264,1280x720,66,31,ultrafast" |
на консоль будет выведен идентификатор
Code Block |
---|
|
42c01f <= "OPENH264,66,31,ultrafast,1280x720" |
Также при помощи инструмента можно получить список всех поддерживаемых профилей для всех кодировщиков
Code Block |
---|
|
sudo bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --catalog --output=catalog.csv |
или для определенного кодировщика
Code Block |
---|
|
sudo bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --catalog --encoders=OPENH264 --output=openH264.csv |
Список выводится в файл в формате CSV
Code Block |
---|
|
codec,profile,level,preset,resolution,profile-level-id |
например
Code Block |
---|
|
FF,0,0,fast,320x180,42c01e
... |
Если библиотеки кодировщика нет в поставке сервера, то при запросе идентификатора профиля инструмент выведет ошибку
Code Block |
---|
|
Unable to create instance of encoder: FF |
а при запросе списка профилей выведет ошибку
Code Block |
---|
|
Unsupported encoder: FF |
и создаст CSV файл нулевой длины.
Известные проблемы
1. Настройка качества кодирования не применяется при использовании OpenH264Симптомы: качество картинки в плеере не изменяется при различных значениях настройки
Симптомы: качество картинки в плеере не изменяется при различных значениях настройки constraints.video.quality
, например
Code Block |
---|
|
constraints.video.quality=5 |
не отличается от
Code Block |
---|
|
constraints.video.quality |
...
Решение: не использовать кодирование на базе OpenH264, поскольку управление CRF в нем не поддерживается
Code Block |
---|
|
constraints.video.quality=5 |
не отличается от
2. Если файл водяного знака поврежден, либо файл отсутствует, используется водяной знак по умолчанию (черная картинка)
Симптомы: при добавлении водяного знака в выходном потоке черный экран, в серверном логе сообщение
Code Block |
---|
|
constraints.video.quality=20Wrong watermark file format. Should be PNG. |
Решение: не использовать кодирование на базе OpenH264, поскольку управление CRF в нем не поддерживается
...
...
использовать только PNG файл с корректной структурой для добавления водяного знака.