...
Формирование имени файла записи потока
Настройка stream_record_policy определяет способ формирования имени файла записи потока. Например,
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy=streamName |
означает, что имя файла будет соответствовать имени потока. Поток, опубликованный при помощи ffmpeg
Code Block | ||||
---|---|---|---|---|
| ||||
ffmpeg -re -i BigBuckBunny.mp4 -preset ultrafast -acodec aac -vcodec h264 -strict -2 -f flv rtmp://test1.flashphoner.com:1935/live/stream_ffmpeg |
будет записан в файл stream_ffmpeg.mp4.
По умолчанию, имя файла формируется по шаблону
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy=template |
В свою очередь, шаблон задается настройкой stream, который задается настройкой stream_record_policy_template. По умолчанию
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy_template=stream-{mediaSessionId}-{login} |
...
Элемент | Описание | Максимальный размер |
---|---|---|
{streamName} | Имя потока | |
{startTime} | Время начала записи потока | 20 символов |
{endTime} | Время окончания записи потока | 20 символов |
{sessionId} | Идентификатор сессии в кодировке BASE64 | 60 символов |
{mediaSessionId} | Идентификатор медиасессии | 36 символов |
{login} | Логин | 32 символа |
{audioCodec} | Аудиокодек | 4 символа |
{videoCodec} | Видеокодек | 4 символа |
Например, настройка
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy_template={streamName} |
означает, что имя файла будет соответствовать имени потока. Поток, опубликованный при помощи ffmpeg
Code Block | ||||
---|---|---|---|---|
| ||||
ffmpeg -re -i BigBuckBunny.mp4 -preset ultrafast -acodec aac -vcodec h264 -strict -2 -f flv rtmp://test1.flashphoner.com:1935/live/stream_ffmpeg |
будет записан в файл stream_ffmpeg.mp4.
Расширение файла добавляется в зависимости от параметров потока и контейнера: mp4 для H264+AAC и webm для VP8+opus.
Если имя файла создается из имени потока, в нем могут быть символы, недопустимые к использованию в именах, например, прямой слэш '/'. В этом случае имя файла должно быть закодировано при помощи настройки
...
Потоки могут записываться частями заданной длительности или объема при помощи параметра record_rotation. Например, настройка
...
определяет длительность фрагмента в 20 секунд. Части нумеруются последовательно, начиная с 1, последняя часть не нумеруется, а настройка
Code Block | ||||
---|---|---|---|---|
| ||||
record_rotation=10M |
задает объем фрагмента в 10 мегабайт.
Если шаблон имени файла содержит элемент {startTime}, фрагменты не нумеруются, в имя файла подставляется время начала записи фрагмента. Если шаблон содержит элемент {endTime}, в имя файла подставляется время окончания записи фрагмента. Например, при настройках
Code Block | ||
---|---|---|
| ||
record_rotation=20 stream_record_policy=template stream_record_policy_template={streamName}-{startTime}-{endTime} |
...
Code Block | ||
---|---|---|
| ||
test-1553577643961-1553577663988_1.mp4 test-1553577663989-1553577683997_2.mp4 test-1553577683997-1553577701626_3.mp4 ... |
Фрагменты нумеруются последовательно, начиная с 1. Для новой медиасессии (даже если опубликован поток с таким же именем) нумерация начинается заново, т.е., если статическая часть шаблона не уникальна (например, только имя потока), файлы, записанные ранее, будут перезаписаны поверх.
При необходимости, нумерация может быть отключена настройкой
Code Block | ||
---|---|---|
| ||
record_rotation_index_enabled=false |
В этом случае индексы не добавляются и ротация осуществляется в полном соответствии с заданным шаблоном имени файла. При этом, если шаблон не обеспечивает уникальность, файлы, записанные ранее, будут перезаписаны поверх.
Скрипт обработки записанных файлов
...
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
/stream/startRecording |
| 404 - Not found 500 - Internal error | Начать запись потока в указанной медиасессии | ||||||||
/stream/stopRecording |
| 404 - Not found 500 - Internal error | Завершить запись потока в указанной медиасессии |
...
Имя параметра | Описание | Пример |
---|---|---|
mediaSessionId | Идентификатор сессии | 5a072377-73c1-4caf-abd3 |
fileName | Имя файла записи | recordStream.mp4 |
force | Перезаписывать файл, если запись уже идет | true |
Если в REST запросе не указано явно имя файла, поток указанной медиасессии будет записан в файл с именем по шаблону, определенному в настройках.
Если имя указано, будет записан файл с таким именем. Если файл уже существует, то
1. При force:false
(по умолчанию), если поток в указанной медиасессии в данный момент записывается в заданный файл, этот файл не будет перезаписан, продолжится текущая запись. Если поток не записывается, и файл существует, он будет перезаписан.
...
config | Настройки записи, имеют приоритет над настройками сервера | |
fileTemplate | Шаблон имени файла записи | {streamName}-{startTime}-{endTime} |
rotation | Включает/отключает ротацию файлов и способ нарезки (время или объем) | 20M |
Логика работы записи по требованию выглядит следующим образом:
- При вызове REST API /stream/startRecording завершается текущая запись, если она идет в данный момент.
- Стартует новая запись, при этом применяются переданные через REST настройки.
- Если какая-либо из настроек не передана, применяется соответствующая настройка сервера.
Например, если необходимо передать точное имя файла для записи потока и отключить ротацию, должен быть передан запрос:
Code Block | ||||
---|---|---|---|---|
| ||||
/stream/startRecording
{
"mediaSessionId":"1234567890abcdefgh",
"config": {
"fileTemplate": "test",
"rotation": "disabled"
}
}
|
Известные проблемы
1. Максимальная длина имени файла во всех актуальных файловых системах Linux ограничена 255 символами. При создании файла записи, имя будет сокращено до данного предела, включая расширение и номер части, если включена ротация.
...