Плейлист HLS из автономных сегментов fmp4

Я работаю над VMS, которая хранит 10-секундные видеосегменты в формате MPEGTS. Затем эти сегменты можно транслировать с помощью HLS со списками воспроизведения, которые выглядят следующим образом:

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:11
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-START:TIME-OFFSET=1.0,PRECISE=YES
#EXTINF:10,
1602816779831000000.ts
#EXTINF:10,
1602816789831000000.ts
#EXT-X-ENDLIST

Это прекрасно работает, пока эти файлы закодированы в h.264. Однако, если я попытаюсь создать аналогичный плейлист с использованием сегментов h.265, он будет работать только с нашим клиентом Android, Apple и hls.js решили поддерживать h.265 HLS, используя только фрагментированный MP4.

Нативная поддержка h.265 путем непосредственного хранения файлов fmp4 для меня не вариант, поэтому я хотел бы переупаковывать эти файлы MPEGTS в fmp4 по требованию.

Итак, что я попытался сделать, это вернуть этот плейлист (изменив только расширение файла):

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:11
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-START:TIME-OFFSET=1.0,PRECISE=YES
#EXTINF:10,
1602816779831000000.mp4
#EXTINF:10,
1602816789831000000.mp4
#EXT-X-ENDLIST

а затем лениво перепаковывать эти файлы MPEGTS в fmp4 один за другим, используя FFMPEG, по мере их запроса:

ffmpeg -i 1602816779831000000.ts -c copy -movflags frag_keyframe+empty_moov+default_base_moof 1602816779831000000.mp4
ffmpeg -i 1602816789831000000.ts -c copy -movflags frag_keyframe+empty_moov+default_base_moof 1602816789831000000.mp4

К сожалению, это работает только для списков воспроизведения с одним сегментом (что в моем случае означает до 10 секунд). Как только у меня есть 2+ файла, он не работает, и его поведение меняется в зависимости от того, какой клиент я использую: некоторые будут воспроизводить первый файл, а затем останавливаться, некоторые будут быстро переходить к последнему файлу, а затем воспроизводить этот. вместо этого некоторые вообще не будут играть ...

Я понимаю, что обычный подход к потоковой передаче fmp4 через HLS заключается в использовании сегмента инициализации мультимедиа и помещении его в заголовок #EXT-X-MAP для каждого сегмента, которые затем обычно кодируются как файлы *.m4s вместо *.mp4. Однако можно ли заставить fmp4 работать через HLS с автономными сегментами, аналогично тому, что мы можем сделать с MPEGTS? Поскольку списки воспроизведения с одной записью, кажется, поддерживают это, я предполагаю, что, вероятно, есть способ сделать это.

Кроме того, я знаю, что Apple вдохновилась MPEG-DASH на эту часть спецификации HLS, и, насколько я понимаю, это возможно в MPEG. -ТИРЕ.


person Mathieu    schedule 16.10.2020    source источник
comment
«Можно ли заставить fmp4 работать через HLS с автономными сегментами». Нет, вам нужен один сегмент инициализации и фрагменты без moov.   -  person szatmary    schedule 16.10.2020
comment
Если вы посмотрите на веб-сайт Apple Developer, раздел Доставка, эти 3 разных типа MIME в списке: Инициализация мультимедиа: Фрагментированный MP4 — видео/mp4 — mp4; Видео или аудио: Фрагментированный MP4 — видео/iso.segment или видео/mp4 — m4s; Видео: Фрагментированный MP4 — видео/mp4 — mp4. Что тогда означает 3-й вариант? Что такое файл *.mp4, который не является файлом инициализации мультимедиа?   -  person Mathieu    schedule 20.10.2020
comment
Добавление флагов #EXT-X-DISCONTINUITY между моими сегментами, кажется, в некоторой степени помогает.   -  person Mathieu    schedule 20.10.2020