Как вывести фрагментированный 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 действительно имеет некоторую (плохо документированную) поддержку для них.