Я выполняю кодированные фрагменты более длинных видеофайлов, где я разбил исходный файл на отдельные последовательности, которые я кодировал отдельно. Эти последовательности представляют собой файлы различной длины, в зависимости от того, где появляются фрагменты сцены - они могут быть длиной от 2 до 5 секунд. Все они начинаются с I-кадра и являются автономными.
Все мои закодированные последовательности - это MP4, например:
test_0000.mp4
test_0001.mp4
test_0002.mp4
test_0003.mp4
test_0004.mp4
Все они имеют общие свойства:
$ mp4info test_0000.mp4
File:
major brand: isom
minor version: 200
compatible brand: isom
compatible brand: iso2
compatible brand: mp41
fast start: no
Movie:
duration: 2016 ms
time scale: 1000
fragments: no
...
Теперь, чтобы играть с DASH-плеером, я должен создать сегмент инициализации и отдельные фрагментированные MP4 .
Я мог бы генерировать фрагментированные MP4 с помощью mp4fragment
, которые я запускаю для каждого отдельного файла MP4:
$ mp4info test_0000.m4s
File:
major brand: isom
minor version: 200
compatible brand: isom
compatible brand: iso2
compatible brand: mp41
compatible brand: iso5
fast start: yes
Movie:
duration: 2016 ms
time scale: 1000
fragments: yes
...
Но очевидно, что теперь они не соответствуют спецификации, и все содержат moov
атом:
Мне понадобятся отдельные сегменты мультимедиа только с одним блоком moof
и mdat
, для чего потребуется сегмент инициализации только с блоком moov
.
Как я могу сгенерировать это из существующих, уже закодированных сегментов?
Я знаю, что это похоже на проблему XY. В принципе, я уже мог сегментировать свой исходный файл непосредственно после кодирования и запускать эти кодировки одновременно, например, используя dash
muxer или MP4Box в ffmpeg, однако:
- Практически нет контроля над размерами получаемых сегментов в отношении минимальной и максимальной продолжительности
- Этот подход не распараллеливает
Я также проверил Bento4; Кажется, он не предлагает эту функциональность. Ни один не делает FFmpeg. MP4Box ведет себя аналогично. Все они предполагают, что у вас есть один длинный файл для начала.
Я вижу, что мог бы соединить блоки ftyp
и moov
из этих «поддельных фрагментов», чтобы создать сегмент инициализации. Но я бы закончил с сегментами, содержащими несколько moof
и mdat
блоков, что не соответствует спецификации - он допускает только один фрагмент и блок медиа-данных:
4. Медиа Сегменты
[…] один дополнительный блок типа сегмента (шип), за которым следует один блок фрагмента фильма (moof), за которым следуют одно или несколько блоков мультимедийных данных (mdat).
Полагаю, я могу жить с этим, если styp
не присутствует.