Table of Contents
Поддерживаемые кодеки
Видео:
- H264
- VP8
- H265 (начиная со сборки 5.2.1803)
Аудио:
- Opus
- AAC
- G711 (PCMA, PCMU)
- G722
В каких случаях включается транскодинг
...
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/transcoder/startup |
| 400 - Bad request 409 - Conflict 500 - Internal error | Создать транскодер с указанными параметрами для заданного потока | |||||||||||||||
/transcoder/find |
|
| 200 – транскодеры найденыOK 404 – транскодеры не найденыNot found | Найти транскодер по указанным критериям | ||||||||||||||
/transcoder/find_all |
| 200 – транскодеры найденыOK 404 – транскодеры не найденыNot found | Найти все транскодеры | |||||||||||||||
/transcoder/terminate |
| 200 - транскодер завершенOK 404 - транскодер не найденNot found | Остановить транскодер и его выходной поток |
Параметры
Имя параметра | Описание | Пример | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
uri | URL транскодера | transcoder://tcode1 | ||||||||||
localStreamName | Имя выходного потока транскодера | testT | ||||||||||
remoteStreamName | Имя транскодируемого потока | test | ||||||||||
localMediaSessionId | Идентификатор медиасессии транскодера | 42a92132-bcd1-4436-a96f-3fec36b32b37 | ||||||||||
status | /transcoder/set_watermark |
| 200 - OK 400 - Bad request 404 - Not found | Добавить водяной знак к потоку транскодера |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
uri | URL транскодера | transcoder://tcode1 |
localStreamName | Имя выходного потока транскодера | testT |
remoteStreamName | Имя транскодируемого потока | test |
localMediaSessionId | Идентификатор медиасессии транскодера | 42a92132-bcd1-4436-a96f-3fec36b32b37 |
status | Текущий статус транскодера | PROCESSED_LOCAL |
hasAudio | Выходной поток содержит аудио | true |
hasVideo | Выходной поток содержит видео | true |
record | Выходной поток записывается | false |
Параметры кодирования | ||
width | Ширина картинки | 640 |
height | Высота картинки (обязательный параметр) | 480 |
keyFrameInterval | Частота генерации ключевых кадров (GOP) | 30 |
fps | Частота кадров в секунду | 30 |
bitrate | Битрейт в кб/с | 500 |
type | Кодек | OPENH264 |
watermark | Файл водяного знака | Test.png |
...
REST-методы и статусы ответа
Имя параметра
Описание
Пример
uri
URL транскодера
transcoder2://tcode2
testT
test
82ad5545-e11e-4f0f-801a-49e69d8c38f2
status
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/transcoder2/startup |
| 200 - OK 400 - Bad request 409 - Conflict 500 - Internal error | Создать транскодер с указанными параметрами для заданного потока | |||||||||||||||
/transcoder2/find |
|
| 200 – OK 404 – Not found | Найти транскодер по указанным критериям | ||||||||||||||
/transcoder/find_all |
| 200 – OK 404 – Not found | Найти все транскодеры | |||||||||||||||
/transcoder/terminate |
| 200 – OK 404 – Not found | Остановить транскодер и его выходной поток |
Параметры
/transcoder2/set_watermark |
| 200 - OK 400 - Bad request 404 - Not found | Добавить водяной знак к потоку транскодера |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
uri | URL транскодера | transcoder2://tcode2 |
localStreamName | Имя выходного потока транскодера | testT |
remoteStreamName | Имя транскодируемого потока | test |
localMediaSessionId | Идентификатор медиасессии транскодера | 82ad5545-e11e-4f0f-801a-49e69d8c38f2 |
status | Текущий статус транскодера | PROCESSED_LOCAL |
hasAudio | Выходной поток содержит аудио | true |
hasVideo | Выходной поток содержит видео | true |
record | Выходной поток записывается | false |
Параметры кодирования | ||
width | Ширина картинки | 320 |
height | Высота картинки (обязательный параметр) | 240 |
audioCodec | Кодек аудио | mpeg4-generic |
audioRate | Частота дискретизации аудио, Гц | 44100 |
audioChannels | Количество каналов аудио | 2 |
audioBitrate | Битрейт аудио, бит/с | 64000 |
videoCodec | Кодек видео | H264 |
keyFrameInterval | Частота генерации ключевых кадров (GOP) | 30 |
fps | Частота кадров в секунду | 30 |
bitrate | Битрейт видео в кб/с | 500 |
type | Кодировщик | OPENH264 |
watermark | Файл водяного знака | Test.png |
videoRate | Частота дискретизации видео, Гц | 90000 |
...
При этом поток будет транскодирован к тем ширине и высоте кадра, которые запрашивает подписчик. Если высота не указана подписчиком, будет установлена высота картинки 120. Если ширина не указана подписчиком, будет установлена ширина картинки 160.
Синхронизация аудио и видео на выходе транскодера
...
Округление ширины картинки при сохранении соотношения сторон
В сборке 5.2.1842 добавлена возможность указать округление ширины картинки при включенном сохранении соотношения сторон. По умолчанию, ширина округляется в меньшую сторону:
Code Block | ||
---|---|---|
| ||
video_transcoder_round_ratio=0 |
Например, при транскодировании картинки 1280x720 к разрешению 480p по умолчанию будет получена картинка 852x480. Настройка
Code Block | ||
---|---|---|
| ||
avvideo_transcoder_pacedround_senderratio=true |
Размер выравнивающего буфера задается в кадрах настройкой
Code Block | ||
---|---|---|
| ||
av_paced_sender_max_buffer_size=5000 |
По умолчанию размер буфера составляет 5000 кадров
...
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 | ||||
---|---|---|---|---|
| ||||
curlsudo -s 'http://localhost:8081/?action=stat&format=json&groups=buffer_stats' |
Добавление водяного знака в определенный поток
...
bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --config="OPENH264,1280x720,66,31,ultrafast" |
на консоль будет выведен идентификатор
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "Test.png"
}
} |
...
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 | ||||
---|---|---|---|---|
| ||||
{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "/opt/media/Test.png"
}
} |
Многопоточное кодирование
...
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 | ||
---|---|---|
| ||
video_encoder_max_threads=2 |
По умолчанию, количество потоков установлено в 2.
...
constraints.video.quality=5 |
не отличается от
Code Block | ||
---|---|---|
| ||
constraints.video.quality=20 |
Решение: не использовать кодирование на базе OpenH264, поскольку управление CRF в нем не поддерживается
Code Block | ||
---|---|---|
| ||
video_encoder_second_thread_threshold=777000 |
...
priority=FF |
2. Если файл водяного знака поврежден, либо файл отсутствует, используется водяной знак по умолчанию (черная картинка)
Симптомы: при добавлении водяного знака в выходном потоке черный экран, в серверном логе сообщение
Code Block | ||
---|---|---|
| ||
video_encoder_second_thread_threshold=408950Wrong watermark file format. Should be PNG. |
Решение: использовать только PNG файл с корректной структурой для добавления водяного знака.