Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Формирование имени файла записи потока

Настройка stream_record_policy определяет способ формирования имени файла записи потока. Например,

Code Block
languagebash
themeRDark
stream_record_policy=streamName

означает, что имя файла будет соответствовать имени потока. Поток, опубликованный при помощи ffmpeg

Code Block
languagebash
themeRDark
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
languagebash
themeRDark
stream_record_policy=template

В свою очередь, шаблон задается настройкой stream, который задается настройкой stream_record_policy_template. По умолчанию

Code Block
languagebash
themeRDark
stream_record_policy_template=stream-{mediaSessionId}-{login}

...

ЭлементОписаниеМаксимальный размер
{streamName}Имя потока
{startTime}Время начала записи потока20 символов
{endTime}Время окончания записи потока20 символов
{sessionId}Идентификатор сессии в кодировке BASE6460 символов
{mediaSessionId}Идентификатор медиасессии36 символов
{login}Логин32 символа
{audioCodec}Аудиокодек4 символа
{videoCodec}Видеокодек4 символа

Например, настройка

Code Block
languagebash
themeRDark
stream_record_policy_template={streamName}

означает, что имя файла будет соответствовать имени потока. Поток, опубликованный при помощи ffmpeg

Code Block
languagebash
themeRDark
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
languagebash
themeRDark
record_rotation=10M

задает объем фрагмента в 10 мегабайт.

Если шаблон имени файла содержит элемент {startTime}, фрагменты не нумеруются, в имя файла подставляется время начала записи фрагмента. Если шаблон содержит элемент {endTime}, в имя файла подставляется время окончания записи фрагмента. Например, при настройках

Code Block
themeRDark
record_rotation=20
stream_record_policy=template
stream_record_policy_template={streamName}-{startTime}-{endTime}

...

Code Block
themeRDark
test-1553577643961-1553577663988_1.mp4
test-1553577663989-1553577683997_2.mp4
test-1553577683997-1553577701626_3.mp4
...

Фрагменты нумеруются последовательно, начиная с 1. Для новой медиасессии (даже если опубликован поток с таким же именем) нумерация начинается заново, т.е., если статическая часть шаблона не уникальна (например, только имя потока), файлы, записанные ранее, будут перезаписаны поверх.

При необходимости, нумерация может быть отключена настройкой

Code Block
themeRDark
record_rotation_index_enabled=false

В этом случае индексы не добавляются и ротация осуществляется в полном соответствии с заданным шаблоном имени файла. При этом, если шаблон не обеспечивает уникальность, файлы, записанные ранее, будут перезаписаны поверх.

Скрипт обработки записанных файлов

...

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/stream/startRecording


Code Block
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3"
 "fileName "config": {
    "fileTemplate": "recordStream.mp4{streamName}-{startTime}-{endTime}",
    "forcerotation": "true20M"
  }
}

404 - Not found

500 - Internal error


Начать запись потока в указанной медиасессии


/stream/stopRecording
Code Block
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3"
}

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
languagejs
themeRDark
/stream/startRecording
{
  "mediaSessionId":"1234567890abcdefgh",
  "config": {
    "fileTemplate": "test",
    "rotation": "disabled"
  }
}

Известные проблемы

1. Максимальная длина имени файла во всех актуальных файловых системах Linux ограничена 255 символами. При создании файла записи, имя будет сокращено до данного предела, включая расширение и номер части, если включена ротация.

...