Я работаю над 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. -ТИРЕ.
#EXT-X-DISCONTINUITY
между моими сегментами, кажется, в некоторой степени помогает. - person Mathieu   schedule 20.10.2020