Создание файла Init из существующих не фрагментированных, сегментированных файлов MP4 - PullRequest
0 голосов
/ 31 октября 2018

Я выполняю кодированные фрагменты более длинных видеофайлов, где я разбил исходный файл на отдельные последовательности, которые я кодировал отдельно. Эти последовательности представляют собой файлы различной длины, в зависимости от того, где появляются фрагменты сцены - они могут быть длиной от 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 атом:

image

Мне понадобятся отдельные сегменты мультимедиа только с одним блоком moof и mdat, для чего потребуется сегмент инициализации только с блоком moov.

Как я могу сгенерировать это из существующих, уже закодированных сегментов?

Я знаю, что это похоже на проблему XY. В принципе, я уже мог сегментировать свой исходный файл непосредственно после кодирования и запускать эти кодировки одновременно, например, используя dash muxer или MP4Box в ffmpeg, однако:

  • Практически нет контроля над размерами получаемых сегментов в отношении минимальной и максимальной продолжительности
  • Этот подход не распараллеливает

Я также проверил Bento4; Кажется, он не предлагает эту функциональность. Ни один не делает FFmpeg. MP4Box ведет себя аналогично. Все они предполагают, что у вас есть один длинный файл для начала.


Я вижу, что мог бы соединить блоки ftyp и moov из этих «поддельных фрагментов», чтобы создать сегмент инициализации. Но я бы закончил с сегментами, содержащими несколько moof и mdat блоков, что не соответствует спецификации - он допускает только один фрагмент и блок медиа-данных:

4. Медиа Сегменты

[…] один дополнительный блок типа сегмента (шип), за которым следует один блок фрагмента фильма (moof), за которым следуют одно или несколько блоков мультимедийных данных (mdat).

Полагаю, я могу жить с этим, если styp не присутствует.

1 Ответ

0 голосов
/ 20 ноября 2018

Я думаю, что самым простым способом было бы использовать MP4Box , подробнее см. Разделение фрагментированного MP4 на несколько файлов MP4 .

...