Как вывести фрагментированный mp4 с помощью ffmpeg?

ffmpeg -i infile.avi out.mp4 выводит не фрагментированный MP4.

Как получить фрагментированный mp4?

Обновление Фрагментированный файл mp4 внутренне разделен на несколько последовательных фрагментов или фрагментов фильма MPEG-4. Каждый фрагмент имеет свой собственный атом moof - поэтому в файле чередуются несколько атомов moof вместо одного moov в конце, как в случае нефрагментированного mp4. Это облегчает потоковую передачу по медленным сетям, где задействована буферизация.

Есть несколько инструментов, таких как mp4box, которые конвертируют обычный mp4 в фрагментированный. К сожалению, мы не можем использовать что-то подобное

ffmpeg <options to output mp4> | mp4box

поскольку ffmpeg не выдает результат поиска при создании контейнеров mp4.

4 ответа

Решение

Это должно сделать трюк:

ffmpeg -re -i infile.ext -g 52 \
-strict experimental -acodec aac -ab 64k -vcodec libx264 -vb 448k \
-f mp4 -movflags frag_keyframe+empty_moov \
output.mp4
  • frag_keyframe вызывает фрагментированный вывод,
  • empty_moov приведет к тому, что выход будет фрагментирован на 100%; без этого первый фрагмент будет смешан как короткий фильм (используя moov) с последующими фрагментами СМИ,
  • -re полезно при прямой трансляции (вывод на битрейт медиа), не используйте его, если вы создаете файл,
  • -g 52 заставляет (по крайней мере) каждый 52-й кадр быть ключевым

Чтобы рассчитать интервал между ключевыми кадрами, см. Параграфы о размерах фрагментов в документах моего потокового сервера. - Вы также можете рассмотреть возможность использования WebM, который является бесплатной альтернативой H.264 (и имеет лучшую поддержку на некоторых платформах, чем фрагментированный mp4).

Важное примечание: муксер FFMpeg установит продолжительность в обоих tkhd а также mdhd атомы в 0xffffffff для каждой дорожки. Это вызывает проблемы в некоторых проигрывателях (например, Quicktime не будет воспроизводить такие файлы). Вы должны найти инструмент и изменить его на ноль (0x00000000).

ОБНОВЛЕНИЕ: Рассматривая фрагментированный MP4 как файл ISMV (Smooth Streaming). Новая версия FFMPEG 0.10, с 27 января 2012 года, может мультиплексировать в этот формат.

ismv muxer AVOptions:
-movflags          <flags> E.... MOV muxer flags
   rtphint                 E.... Add RTP hint tracks
   empty_moov              E.... Make the initial moov atom empty (not supported by QuickTime)
   frag_keyframe           E.... Fragment at video keyframes
   separate_moof           E.... Write separate moof/mdat atoms for each track
   frag_custom             E.... Flush fragments on caller requests
   isml                    E.... Create a live smooth streaming feed (for pushing to a publishing point)
-moov_size         <int>   E.... maximum moov size so it can be placed at the begin
-rtpflags          <flags> E.... RTP muxer flags
   latm                    E.... Use MP4A-LATM packetization instead of MPEG4-GENERIC for AAC
   rfc2190                 E.... Use RFC 2190 packetization instead of RFC 4629 for H.263
   skip_rtcp               E.... Don't send RTCP sender reports
-skip_iods         <int>   E.... Skip writing iods atom.
-iods_audio_profile <int>  E.... iods audio profile atom.
-iods_video_profile <int>  E.... iods video profile atom.
-frag_duration     <int>   E.... Maximum fragment duration
-min_frag_duration <int>   E.... Minimum fragment duration
-frag_size         <int>   E.... Maximum fragment size
-ism_lookahead     <int>   E.... Number of lookahead entries for ISM files

Возможно, это поможет. В приведенном ниже примере ffmpeg получает копию файла RTMP, а затем, используя ffmpeg, создает вывод HTTP в fMP4, который может быть принят точками входа IIS или Azure.

Примечание: исходный кодер установлен на интервал ключевых кадров 2 секунды.

ffmpeg -i rtmp://ip of server:1935/name/streamkey -vcodec copy -acodec copy -nal-hrd cbr -movflags isml+frag_keyframe+separate_moof -f ismv http://url of entry point/entry-point.isml/Streams(feed1)

ffmpeg -h (но не справочная страница) имеет следующее:

mp4 muxer AVOptions:  
-movflags          <flags> E.... MOV muxer flags
   rtphint                 E.... Add RTP hint tracks
-moov_size         <int>   E.... maximum moov size so it can be placed at the
                                 beginning
-frag_size         <int>   E.... maximum fragment size
-frag_duration     <int>   E.... maximum fragment duration
-rtpflags          <flags> E.... RTP muxer flags
   latm                    E.... Use MP4A-LATM packetization instead of
                                 MPEG4-GENERIC for AAC
-skip_iods          <int>   E.... Skip writing iods atom.
-iods_audio_profile <int>   E.... iods audio profile atom.
-iods_video_profile <int>   E.... iods video profile atom.

Я бы не знал, как определить фрагментированный mp4, если бы увидел его, но похоже, что ffmpeg действительно имеет некоторую (плохо документированную) поддержку для них.

Другие вопросы по тегам