...
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 | Имя выходного потока транскодера | /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-метод | Пример тела 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 | Остановить транскодер и его выходной поток |
Параметры
...
Имя параметра
...
Описание
...
Пример
...
uri
...
URL транскодера
...
transcoder2://tcode2
...
testT
...
test
...
82ad5545-e11e-4f0f-801a-49e69d8c38f2
...
status
...
Текущий статус транскодера
...
PROCESSED_LOCAL
...
true
...
true
...
false
...
320
...
240
...
30
...
30
...
500
...
OPENH264
...
Ограничения
1. Если параметры транскодирования видео переданы для потока без видео, либо параметры транскодирования аудио переданы для потока без аудио, запрос вернет 400 Bad request
Краткое руководство по тестированию
1. Для тестирования используем
- WCS-сервер;
- Веб-приложение Two Way Streaming для публикации потока;
- Веб-приложение Player для воспроизведения выходного потока транскодера;
- браузер Chrome и REST-клиент для отправки запросов на сервер
2. Откройте приложение Two Way Streaming, опубликуйте поток test
3. Откройте REST-клиент, отправьте запрос /transcoder/startup
4. Откройте веб-приложение Player, укажите в поле Stream имя потока testT и нажмите Start
5. Откройте REST-клиент, отправьте запрос /transcoder/terminate
6. Воспроизведение потока останавливается в связи с остановкой транскодера
Сохранение соотношения сторон видео при транскодинге
По умолчанию, если поток опубликован с одними размерами кадра, а запрашивается для воспроизведения с другими размерами, WCS пытается сохранить соотношение сторон видео. Например, если на сервере опубликован поток разрешением 640x360 и соотношением сторон 16:9, а подписчик запрашивает воспроизведение 320x240 (4:3), поток будет транскодирован к разрешению 320x180 (16:9). Если подписчик запрашивает только высоту картинки, не указывая ширину, соотношение сторон также будет сохранено.
Для того, чтобы отключить сохранение соотношения сторон, необходимо установить следующий параметр в файле flashphoner.properties
Code Block | ||
---|---|---|
| ||
video_transcoder_preserve_aspect_ratio=false |
При этом поток будет транскодирован к тем ширине и высоте кадра, которые запрашивает подписчик. Если высота не указана подписчиком, будет установлена высота картинки 120. Если ширина не указана подписчиком, будет установлена ширина картинки 160.
Синхронизация аудио и видео на выходе транскодера
По умолчанию, транскодер не синхронизирует аудио и видео в выходном потоке, оставляя значение синхронизации как есть. Это может приводить к несовпадению звука и видео в транскодированном потоке. Чтобы этого избежать, в сборке 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' |
Добавление водяного знака в определенный поток
...
| 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 |
Ограничения
1. Если параметры транскодирования видео переданы для потока без видео, либо параметры транскодирования аудио переданы для потока без аудио, запрос вернет 400 Bad request
Краткое руководство по тестированию
1. Для тестирования используем
- WCS-сервер;
- Веб-приложение Two Way Streaming для публикации потока;
- Веб-приложение Player для воспроизведения выходного потока транскодера;
- браузер Chrome и REST-клиент для отправки запросов на сервер
2. Откройте приложение Two Way Streaming, опубликуйте поток test
3. Откройте REST-клиент, отправьте запрос /transcoder/startup
4. Откройте веб-приложение Player, укажите в поле Stream имя потока testT и нажмите Start
5. Откройте REST-клиент, отправьте запрос /transcoder/terminate
6. Воспроизведение потока останавливается в связи с остановкой транскодера
Сохранение соотношения сторон видео при транскодинге
По умолчанию, если поток опубликован с одними размерами кадра, а запрашивается для воспроизведения с другими размерами, WCS пытается сохранить соотношение сторон видео. Например, если на сервере опубликован поток разрешением 640x360 и соотношением сторон 16:9, а подписчик запрашивает воспроизведение 320x240 (4:3), поток будет транскодирован к разрешению 320x180 (16:9). Если подписчик запрашивает только высоту картинки, не указывая ширину, соотношение сторон также будет сохранено.
Для того, чтобы отключить сохранение соотношения сторон, необходимо установить следующий параметр в файле flashphoner.properties
Code Block | ||
---|---|---|
| ||
video_transcoder_preserve_aspect_ratio=false |
При этом поток будет транскодирован к тем ширине и высоте кадра, которые запрашивает подписчик. Если высота не указана подписчиком, будет установлена высота картинки 120. Если ширина не указана подписчиком, будет установлена ширина картинки 160.
Синхронизация аудио и видео на выходе транскодера
По умолчанию, транскодер не синхронизирует аудио и видео в выходном потоке, оставляя значение синхронизации как есть. Это может приводить к несовпадению звука и видео в транскодированном потоке. Чтобы этого избежать, в сборке 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": "transcodertranscoder2://tcode1", "remoteStreamNamewatermark": "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" }"/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":""
} |
Многопоточное кодирование
...
Code Block | ||
---|---|---|
| ||
video_encoder_max_threads=2 |
По умолчанию, количество потоков установлено в 2.
...
_threads=2 |
По умолчанию, количество потоков установлено в 2.
Многопоточное кодирование включается в зависимости от разрешения выходного потока транскодера. Граница устанавливается при помощи следующей настройки
Code Block | ||
---|---|---|
| ||
video_encoder_second_thread_threshold=777000 |
Значение представляет собой произведение ширины картинки на высоту. Таким образом, по умолчанию в несколько потоков кодируются картинки разрешением 720p. При необходимости, этот порог можно понизить. Например, для того, чтобы кодировать в несколько потоков картинки 480p, установите значение
Code Block | ||
---|---|---|
| ||
video_encoder_second_thread_threshold=777000 |
...
408950 |
Известные проблемы
1. Настройка качества кодирования не применяется при использовании OpenH264
Симптомы: качество картинки в плеере не изменяется при различных значениях настройки constraints.video.quality
, например
Code Block | ||
---|---|---|
| ||
constraints.video.quality=5 |
не отличается от
Code Block | ||
---|---|---|
| ||
constraints.video.quality=20 |
Решение: не использовать кодирование на базе OpenH264, поскольку управление CRF в нем не поддерживается
Code Block | ||
---|---|---|
| ||
video_encoder_second_thread_threshold=408950priority=FF |