Versions Compared

Key

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

...

  • MP4 для кодеков H.264 + AAC
  • WebM для кодека кодеков VP8 + Vorbis
  • WebM для кодеков H264 + opus (начиная со сборки 2.0.2001)
  • TS для кодеков H.264 + ADTS
  • MKV (начиная со сборки 5.2.1190)

...

Обратите внимание, что потоки, которые не содержат видео дорожки, всегда записываются в MP4 контейнер (кодек AAC).

Начиная со сборки 2.0.2001, для записи WebRTC потоков H264+opus поддерживается также контейнер WebM

Code Block
themeRDark
record_formats=h264-webm,vp8-webm

Запись потоков в контейнер MPEG-TS

...

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

Code Block
themeRDark
file_recorder_error_interval=60
file_recorder_max_errors_per_interval=3

Если к ошибке привел определенный кадр в медиапотоке, этот и последующие кадры не будут записаны, до успешного получения очередного ключевого кадра.умолчанию, запись потока останавливается после 3 ошибок в течение 60 минут:

Code Block
themeRDark
file_recorder_error_interval=60
file_recorder_max_errors_per_interval=3

Если к ошибке привел определенный кадр в медиапотоке, этот и последующие кадры не будут записаны, до успешного получения очередного ключевого кадра.

Запись актуальных данных в заголовок MP4 контейнера

В сборке 5.2.1990 добавлена возможность периодической записи актуальных данных в заголовок MP4 контейнера

Code Block
themeRDark
mp4_container_moov_first_reserve_space=true
mp4_container_write_header_on_fly=true

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

Code Block
themeRDark
mp4_container_write_header_on_fly_interval=5

Это позволяет проиграть записанный файл даже при внезапной остановке записи в случае ошибки. Данные будут доступны для проигрывания в соответствии с заголовком.

Ротация при заполнении заголовка MP4 контейнера

Начиная со сборки 5.2.2012, если включено резервирование места под заголовок MP4 файла, и во время записи заполняется MOOV атом в заголовке, запись автоматически ротируется по максимально допустимому объему данных. Например, при публикации потока 1920x1080 с битрейтом 3 Мбит/c, 30 fps и записи этого потока с настройками

Code Block
themeRDark
mp4_container_moov_first_reserve_space=true
mp4_container_moov_reserved_space_size=2048

длительность одной части составит около 22 минут, размер одной части около 510 Мб.

Запись данных в заголовок MP4 контейнера без резервирования места в файле

При длительной записи, требуется резервирование значительных объемов свободного места под заголовок MP4 файла. Например, для записи 1080p потока в течение одного часа потребуется зарезервировать более 5 Мб под заголовок, и при более коротких записях в заголовке останется незаполненное место. В связи с этим, в сборке 5.2.2020 процесс записи актуальных данных в заголовок MP4 контейнера был изменен. С настройкой

Code Block
themeRDark
mp4_container_write_header_on_fly=true

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

Code Block
languagebash
themeRDark
-rw-r--r-- 1 flashphoner flashphoner  45293 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.header
-rw-r--r-- 1 flashphoner flashphoner 924777 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.tmp

В файл с расширением .header записываются данные заголовка, в файл .tmp - медиаданные. По окончании записи файлы объединяются

Code Block
languagebash
themeRDark
-rw-r--r-- 1 flashphoner flashphoner 1930149 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4

Если по какой-то причине запись была аварийно остановлена, на диске останутся файл заголовка и файл данных. В этом случае для проигрывания данных, которые были записаны, достаточно объединить эти файлы

Code Block
languagebash
themeRDark
cat test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.header test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.tmp > test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4

Клиентская часть

При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра record, переданного функции createStream в скрипте публикующего клиента:

...

Code Block
languagejs
themeRDark
{
  ...,
  "mixerDecodeStreamName": falsetrue
}

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

...