...
- 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 | ||
---|---|---|
| ||
record_formats=h264-webm,vp8-webm |
Запись потоков в контейнер MPEG-TS
...
Если к ошибке привел определенный кадр в медиапотоке, этот и последующие кадры не будут записаны, до успешного получения очередного ключевого кадра.
Запись актуальных данных в заголовок MP4 контейнера
В сборке 5.2.1990 добавлена возможность периодической записи актуальных данных в заголовок MP4 контейнера
Code Block | ||
---|---|---|
| ||
mp4_container_moov_first_reserve_space=true
mp4_container_write_header_on_fly=true |
В этом случае данные заголовка периодически обновляются в соответствии с записанными в файл медиаданными. Период обновления задается настройкой в секундах
Code Block | ||
---|---|---|
| ||
mp4_container_write_header_on_fly_interval=5 |
Это позволяет проиграть записанный файл даже при внезапной остановке записи в случае ошибки. Данные будут доступны для проигрывания в соответствии с заголовком.
Ротация при заполнении заголовка MP4 контейнера
Начиная со сборки 5.2.2012, если включено резервирование места под заголовок MP4 файла, и во время записи заполняется MOOV атом в заголовке, запись автоматически ротируется по максимально допустимому объему данных. Например, при публикации потока 1920x1080 с битрейтом 3 Мбит/c, 30 fps и записи этого потока с настройками
Code Block | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
mp4_container_write_header_on_fly=true |
и другими настройками по умолчанию заголовок будущего файла записи пишется в отдельный файл. Таким образом, запись состоит из двух файлов, например
Code Block | ||||
---|---|---|---|---|
| ||||
-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 | ||||
---|---|---|---|---|
| ||||
-rw-r--r-- 1 flashphoner flashphoner 1930149 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4 |
Если по какой-то причине запись была аварийно остановлена, на диске останутся файл заголовка и файл данных. В этом случае для проигрывания данных, которые были записаны, достаточно объединить эти файлы
Code Block | ||||
---|---|---|---|---|
| ||||
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 в скрипте публикующего клиента:
...