Создать фрагментированный MP4 из MP3

Я пытаюсь преобразовать файл MP3 в фрагментированный MP4 следующим образом:

ffmpeg -i input.mp3 -strict experimental -acodec aac -b:a 256k -f mp4 \
       -movflags faststart+frag_keyframe+empty_moov+separate_moof output.mp4 

Однако, используя Bento4, я вижу, что есть только один гигант mdat объект вместо серии таких:

[ftyp] size=8+24
  major_brand = isom
  minor_version = 200
  compatible_brand = isom
  compatible_brand = iso2
  compatible_brand = iso6
  compatible_brand = mp41
[moov] size=8+701
  ...
[moof] size=8+62364
  ...
[mdat] size=8+5794679
[mfra] size=8+59
  [tfra] size=12+31, version=1
    track_ID = 1
    length_size_of_traf_num = 0
    length_size_of_trun_num = 0
    length_size_of_sample_num = 0
  [mfro] size=12+4
    mfra_size = 67

Я думаю, что я хочу это:

введите здесь описание изображения

(источник)

Но я не могу получить это от ffmpeg.

Я нашел несколько других вариантов здесь, например

$ ffmpeg -h muxer=ismv
...
-frag_duration     <int>   E.... Maximum fragment duration
-min_frag_duration <int>   E.... Minimum fragment duration
-frag_size         <int>   E.... Maximum fragment size

но игра с ними не изменила результат.

Как я могу создавать фрагменты определенного вида, например. ~ 5 секунд каждый?


person Stefan Falk    schedule 24.10.2020    source источник


Ответы (1)


Аудиопотоки не имеют ключевых кадров, на что мультиплексор MP4 по умолчанию опирается для разграничения границ фрагментов. Вам нужно будет установить продолжительность фрагмента.

ffmpeg -i input.mp3 -c:a aac -b:a 256k -f mp4 -movflags +empty_moov+separate_moof -frag_duration 10M output.mp4

Примечание:

  1. faststart применим для обычного нефрагментированного вывода
  2. frag_keyframe указывает ffmpeg начинать фрагменты с ключевых кадров video, но у вас нет видеопотока.
  3. -strict experimental не требуется для собственного кодировщика AAC с 2016 года.
  4. frag_duration ожидает значение в микросекундах. 10M = 10 миллионов = 10 секунд.
person Gyan    schedule 25.10.2020
comment
К сожалению, результат этого не воспроизводится в Chrome. Мне удалось получить что-то играбельное с помощью faststart+frag_every_frame+empty_moov+separate_moof, но здесь я не могу управлять frag_duration. Кажется, что аргумент игнорируется в этом случае. - person Stefan Falk; 25.10.2020
comment
Работает здесь в Chrome 86 и FF 82. Поделитесь полным журналом. - person Gyan; 25.10.2020
comment
Вы используете MSE SourceBuffer в режиме сегмента? - person Stefan Falk; 25.10.2020
comment
Я просто загружаю локальный файл в эти браузеры. - person Gyan; 25.10.2020
comment
Да, в том-то и дело. Если вы сделаете это, даже MP3 будет работать в Firefox. Но это не так, если вы используете это дерьмо, которое они называют Media Source Extention (MSE).. Мне это нужно для того, чтобы частично загружать аудиофайлы, а не загружать весь файл перед воспроизведением. И каждый браузер делает свою собственную работу, чтобы улучшить ситуацию. Извините за напыщенную речь, просто уже не весело.. - person Stefan Falk; 25.10.2020
comment
Вы должны поднять вопрос в Chrome о том, является ли это неотъемлемым ограничением MSE в Chrome. - person Gyan; 25.10.2020
comment
Хотя это не ошибка. Это просто то, как это реализуют браузеры. И я даже не думаю, что это совпадение, что они делают это не так, как другие браузеры. - person Stefan Falk; 25.10.2020
comment
Знаете ли вы вариант, который гарантирует, что продолжительность трека также будет сохранена в фрагментированном MP4? Использую ли я эту программу для чтения файлов, она говорит, что продолжительность не определена download.tsi.telecom-paristech.fr/gpac/mp4box.js/ - person Stefan Falk; 14.11.2020
comment
Какое конкретное поле? - person Gyan; 14.11.2020
comment
Если я посмотрю на обзор файлов, продолжительность будет 00:00 (или не определена). Я до сих пор не уверен, как я могу искать внутри fMP4. На самом деле, я даже не уверен, действительно ли он должен быть фрагментирован в моем случае. Все, что я хочу поддержать, это то, что пользователь может сразу слушать аудио, не загружая весь файл. Чтобы это работало, не должно быть необходимости в большем количестве фрагментов, чем один, верно? - person Stefan Falk; 14.11.2020
comment
По крайней мере технически но тут есть МСЭ SourceBuffer .. - person Stefan Falk; 14.11.2020