Описание
В сборке 5.2.841 добавлена возможность вставки одного опубликованного на сервере потока в другой. Эту функцию можно использовать, например, для добавления рекламы в поток. При этом содержимое одного потока полностью заменяется другим, либо до окончания публикации второго потока, либо до прекращения вставки.
Поддерживаемые кодеки
Видео:
- H264
- VP8
Аудио:
- Opus
- AAC
- G711
Ограничения
1. Оба потока, к которым применяется вставка, должны быть закодированы одинаковыми аудио и видео кодеками.
2. Для аудио, должна быть одинаковая частота дискретизации и одинаковое количество каналов.
3. Вставка не применяется к потокам звонков. Для звонков используются собственные технологии вставки аудио и видео.
4. В один поток может быть вставлен только один поток одновременно, но один и тот же поток может быть вставлен в несколько потоков.
5. Циклическая вставка не поддерживается. Невозможно вставить stream1 в stream2, а затем stream2 в stream1 без остановки предыдущей вставки.
Реализация вставки в сборках до 5.2.1618
Управление вставкой при помощи REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
HTTP: http://test.flashphoner.com:8081/rest-api/stream/inject/startup
- HTTPS: https://test.flashphoner.com:8444/rest-api/stream/inject/startup
Здесь:
- test.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /stream/inject/startup - используемый REST-метод
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание |
|---|---|---|---|---|
/stream/inject/startup | {
"localStreamName": "stream1",
"remoteStreamName": "stream2"
}
| 200 - OK 400 - Bad request 404 - Not found 409 - Conflict 500 - Internal error | Вставить поток stream2 в stream1 | |
| /stream/inject/find_all | [
{
"localStreamName": "stream1",
"remoteStreamName": "stream2"
}
]
| 200 - OK 404 - Not found | Найти все вставки на сервере | |
| /stream/inject/terminate | {
"localStreamName": "stream1"
}
| 200 - OK 400 - Bad request 404 - Not found 500 - Internal error | Остановить вставку в поток stream1 |
Параметры
Имя параметра | Описание | Пример |
|---|---|---|
| localStreamName | Имя потока, в который производится вставка | stream1 |
| remoteStreamName | Имя потока, который будет вставлен | stream2 |
Вставка VOD потока из файла
В сборке 5.2.1535 добавлена возможность вставить VOD поток непосредственно из файла при отправке запроса /stream/inject/startup:
{
"localStreamName":"host",
"remoteStreamName":"vod-live://advertising.mp4"
}
При этом вставляемый файл начинает проигрываться без пауз, с первого ключевого кадра. Если этот же файл вставить в другой поток, в том потоке файл также начнет проигрываться с начала.
Эта возможность полезна, например, при вставке рекламных роликов в поток, который смотрят зрители.
Настройка
В сборке 5.2.1235 добавлена настройка, которая определяет, в течение какого времени в миллисекундах необходимо ждать ключевого кадра во вставляемом потоке
inject_wait_keyframe_ms=1000
По умолчанию, интервал составляет 1000 миллисекунд. Если ключевой кадр во вставляемом потоке за это время не был получен, сервер начинает генерировать черный фон (по умолчанию), либо кадр с изображением из файла, заданного в настройке custom_watermark_filename . Это поведение можно отключить настройкой
inject_wait_keyframe_ms=-1
В этом случае будет продолжаться проигрывание потока, в который производится вставка, до момента получения ключевого кадра во вставляемом потоке.
Реализация вставки в сборке 5.2.1618 и новее
Настройка
В сборке 5.2.1618 добавлена новая реализация вставки одного потока в другой, позволяющая выбрать, какую именно составляющую заменить: аудио, видео или обе. Эта возможность включается настройкой
use_new_injector=true
REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
HTTP: http://test.flashphoner.com:8081/rest-api/stream/inject2/startup
- HTTPS: https://test.flashphoner.com:8444/rest-api/stream/inject2/startup
Здесь:
- test.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /stream/inject2/startup - используемый REST-метод
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание |
|---|---|---|---|---|
/stream/inject2/startup | {
"localStreamName": "test",
"remoteStreamName": "test2",
"video": true,
"audio": true,
"muteIfAbsent": true
}
| 200 - OK 400 - Bad request 404 - Not found 409 - Conflict 500 - Internal error | Вставить поток test2 в поток test | |
| /stream/inject2/find_all | [
{
"streamName": "test",
"videoInjectorInfo": {
"targetStreamName": "test2",
"rootStreamName": "test2",
"startTime": 1683344295099
},
"audioInjectorInfo": {
"targetStreamName": "test2",
"rootStreamName": "test2",
"startTime": 1683344295056
}
}
]
| 200 - OK 404 - Not found | Найти все вставки на сервере | |
| /stream/inject2/terminate | {
"localStreamName": "test"
}
| 200 - OK 400 - Bad request 404 - Not found 500 - Internal error | Остановить вставку в поток test |
Параметры
Имя параметра | Описание | Пример |
|---|---|---|
| localStreamName | Имя потока, в который производится вставка | test |
| remoteStreamName | Имя потока, который будет вставлен | test2 |
| video | Заменять видео составляющую при вставке потока | true |
| audio | Заменять аудио составляющую при вставке потока | true |
| muteIfAbsent | Заменять составляющую, которой нет в исходном потоке, на темноту или тишину | true |
| videoInjectorInfo | Информация о видео из вставленного потока | { "targetStreamName": "test2", "rootStreamName": "test2", "startTime": 1683344295099 } |
| audioInjectorInfo | Информация об аудио из вставленного потока | { "targetStreamName": "test2", "rootStreamName": "test2", "startTime": 1683344295056 } |
Вставка VOD потока из файла
В сборке 5.2.1719 добавлена возможность вставить VOD поток непосредственно из файла при отправке запроса /stream/inject2/startup:
{
"localStreamName":"host",
"remoteStreamName":"vod-live://advertising.mp4",
"video":true,
"audio":true
}
При этом вставляемый файл начинает проигрываться без пауз, с первого ключевого кадра. Если этот же файл вставить в другой поток, в том потоке файл также начнет проигрываться с начала.
Эта возможность полезна, например, при вставке рекламных роликов в поток, который смотрят зрители.
Краткое руководство по тестированию
1. Для тестирования используем
- WCS-сервер;
- Веб-приложение Media Devices для публикации потоков;
- Две веб-камеры, либо два различных ПК для публикации потоков;
- Веб-приложение Player для воспроизведения потока;
- браузер Chrome и REST-клиент для отправки запросов на сервер
2. Откройте приложение Media Devices, опубликуйте поток test разрешением 640x360
2. Проиграйте поток test в примере Player
3. Опубликуйте поток adv в примере Media Devices, используя другую вкладку браузера, другую камеру или другой ПК
4. Откройте REST-клиент, отправьте запрос /stream/inject/startup
5. В потоке test воспроизводится содержимое потока adv
6. Отправьте запрос /stream/inject/terminate
7. В потоке test вновь играет оригинальное содержимое
Известные проблемы
1. По окончании вставки одного RTMP потока в другой может теряться синхронизация между аудио и видео а оригинальном потоке
Симптомы: при вставке RTMP потока в другой RTMP поток, по окончании вставки оригинальный поток играет с рассинхронизацией аудио и видео
Решение: включить буферизацию входящих RTMP потоков
rtmp_in_buffer_enabled=true








