Table of Contents |
---|
Описание
В сборке 5.2.1193 добавлена возможность публикации MPEG-TS RTP потока по UDP на WCS, а в сборке 5.2.1253 MPEG-TS поток может быть опубликован по SRT. Данный способ может быть удобен для публикации H264+AAC потока из программного или аппаратного кодировщика, поддерживающего MPEG-TS.
Протокол SRT является более надежным по сравнению с UDP, поэтому по возможности рекомендуется использовать SRT для публикации MPEG-TS.
Поддержка кодеков
- H264
- AAC
Схема работы
1. Публикующий клиент отправляет REST API запрос /mpegts/startup
...
5. Браузер получает WebRTC поток и воспроизводит этот поток на странице.
Тестирование
1. Для теста используем:
- WCS сервер
- ffmpeg для публикации MPEG-TS потока
- веб-приложение Player в браузере Chrome для воспроизведения потока
2. Отправляем запрос /mpegts/startup
с указанием имени потока test
SRT:
Code Block | ||||
---|---|---|---|---|
| ||||
curl -H "Content-Type: application/json" -X POST http://test1.flashphoner.com:8081/rest-api/mpegts/startup -d '{"localStreamName":"test","transport":"srt"}' |
UDP:
Code Block | ||||
---|---|---|---|---|
| ||||
curl -H "Content-Type: application/json" -X POST http://test1.flashphoner.com:8081/rest-api/mpegts/startup -d '{"localStreamName":"test","transport":"udp"}' |
Здесь test1.flashphoner.com
- адрес WCS сервера
3. Получаем от сервера ответ 200 OK
SRT:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508",
"localStreamName": "test",
"uri": "srt://test1.flashphoner.com:31014",
"status": "CONNECTED",
"hasAudio": true,
"hasVideo": true,
"record": false,
"timeout": 90000,
"maxTimestampDiff": 90000
} |
UDP:
Code Block | ||||
---|---|---|---|---|
| ||||
{ "localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508", "localStreamName": "test", "uri": "udp://test1.flashphoner.com:3100631014", "status": "CONNECTED", "hasAudio": true, "hasVideo": true, "record": false, "timeout": 90000, "maxTimestampDiff": 90000 } |
4. Публикуем MPEG-TS поток по указанному URI
SRT:
Code Block | ||||
---|---|---|---|---|
| ||||
ffmpeg -re -i bunny360p.mp4 -c:v libx264 -c:a aac -b:a 160k -bsf:v h264_mp4toannexb -keyint_min 60 -profile:v baseline -preset veryfast -f mpegts "srt://test1.flashphoner.com:31014" |
UDP:
Code Block | ||||
---|---|---|---|---|
| ||||
ffmpeg -re -i bunny360p.mp4 -c:v libx264 -c:a aac -b:a 160k -bsf:v h264_mp4toannexb -keyint_min 60 -profile:v baseline -preset veryfast -f mpegts "udp://test1.flashphoner.com:3100631014?pkt_size=1316" |
5. Открываем веб-приложение Player. Укажите в поле "Stream" имя потока test
и нажмите кнопку "Start". Начнется трансляция опубликованного потока
Настройки
Остановка публикации при отсутствии медиаданных
По умолчанию, публикация MPEG-TS потока будет остановлена на стороне сервера, если сервер не получает медиаданных в течение 90 секунд. Это время задается настройкой в миллисекундах
Code Block | ||
---|---|---|
| ||
mpegts_stream_timeout=90000 |
Отключение подписчиков при остановке передачи данных от публикующего клиента
Если публикующий клиент по какой-то причине остановил передачу медиаданных, а затем возобновил (например, перезапустил ffmpeg), нарушается последовательность временных меток кадров потока. Такой поток не может быть корректно воспроизведен по WebRTC. В связи с этим, если зафиксировано нарушение последовательности временных меток для публикуемого MPEG TS потока, все подписчики принудительно отключаются, и должны заново подключиться к нему. Максимально допустимое изменение двух соседних временных меток задается настройкой в секундах
Code Block | ||
---|---|---|
| ||
mpegts_max_pts_diff=1 |
REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
...
- test.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /mpegts/startup - используемый REST-метод
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/mpegts/startup |
|
| 200 - OK 409 - Conflict 500 - Internal error | Начать публикацию MPEG-TS потока | ||||||||||||||
/mpegts/find |
|
| 200 – потоки найдены 404 – потоки не найдены 500 - Internal error | Найти MPEG-TS поток по заданным критериям | ||||||||||||||
/mpegts/find_all |
| 200 – потоки найдены 404 – потоки не найдены 500 - Internal error | Найти все опубликованные MPEG-TS потоки | |||||||||||||||
/mpegts/terminate |
| 200 - поток завершен 404 - поток не найден 500 - Internal error | Завершить MPEG-TS поток |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
localStreamName | Имя, которое будет присвоено опубликованному потоку | test |
uri | URI для публикации потока | udp://192.168.1.39:3100631014 |
localMediaSessionId | Идентификатор медиасессии потока | 32ec1a8e-7df4-4484-9a95-e7eddc45c508 |
status | Статус потока | CONNECTED |
hasAudio | Поток содержит аудио | true |
hasVideo | Поток содержит видео | true |
record | Поток записывается | false |
timeout | Максимальное время ожидания медиаданных, мс | 90000 |
maxTimestampDiff | Максимально допустимое изменение метки времени, мс | 90000 |
Публикация только аудио или только видео
Начиная со сборки 5.2.1253, можно начать публикацию только видео или только аудио потока, указав соответствующий параметр REST API запроса /mpegts/startup
- поток только с видео
Code Block | ||||
---|---|---|---|---|
| ||||
{
"localStreamName":"mpegts-video-only",
"transport":"srt",
"hasAudio": false
} |
- поток только с аудио
Code Block | ||||
---|---|---|---|---|
| ||||
{
"localStreamName":"mpegts-audio-only",
"transport":"srt",
"hasVideo": false
} |
Публикация аудио с различными частотами дискретизации
По умолчанию, для публикации MPEG-TS используются следующие параметры видео и аудио
Code Block | ||
---|---|---|
| ||
v=0
o=- 1988962254 1988962254 IN IP4 0.0.0.0
c=IN IP4 0.0.0.0
t=0 0
a=sdplang:en
m=audio 1 RTP/AVP 102
a=rtpmap:102 mpeg4-generic/44100/2
a=sendonly
m=video 1 RTP/AVP 119
a=rtpmap:119 H264/90000
a=sendonly |
Видео должно быть опубликовано в кодеке H264 с частотой дискретизации 90000 Гц, аудио должно быть опубликовано в кодеке AAC с частотой дискретизации 44100 Гц и двумя каналами.
При необходимости, можно указать поддержку нескольких частот дискретизации аудио, либо поддержку одноканального звука. Для этого необходимо:
1. Cоздать в каталоге /usr/local/FlashphonerWebCallServer/conf
файл mpegts_agent.sdp
Code Block | ||||
---|---|---|---|---|
| ||||
sudo touch /usr/local/FlashphonerWebCallServer/conf/mpegts_agent.sdp |
2. Добавить в файл необходимое описание параметров SDP
Code Block | ||||
---|---|---|---|---|
| ||||
sudo nano /usr/local/FlashphonerWebCallServer/conf/mpegts_agent.sdp |
например
Code Block | ||
---|---|---|
| ||
v=0
o=- 1988962254 1988962254 IN IP4 0.0.0.0
c=IN IP4 0.0.0.0
t=0 0
a=sdplang:en
m=audio 1 RTP/AVP 102 103 104
a=rtpmap:102 mpeg4-generic/44100/2
a=rtpmap:103 mpeg4-generic/48000/2
a=rtpmap:104 mpeg4-generic/32000/1
a=sendonly
m=video 1 RTP/AVP 119
a=rtpmap:119 H264/90000
a=sendonly |
3. Установить нужные права и перезапустить WCS, чтобы применить изменения
Code Block | ||||
---|---|---|---|---|
| ||||
sudo nano /usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions
sudo systemctl restart webcallserver |
Известные проблемы
1. Если публикация MPEG-TS потока по UDP была остановлена на стороне сервера по REST API /mpegts/terminate
, публикующий кодировщик продолжает отправлять медиаданные
...
Решение: для UDP это ожидаемое поведение, поскольку самим протоколом не предусмотрены никакие оповещения отправляющей стороны о том. что порт, принимающий данные, уже закрыт. Используйте протокол SRT, в котором данный случай обрабатывается корректно, и публикующий клиент останавливается.