Как вывести фрагментированную mp4 с помощью ffmpeg?
ffmpeg -i infile.avi out.mp4
выводит нефрагментированный MP4.
Как получить фрагментированный mp4?
Обновление
Фрагментированный файл mp4 внутренне разделен на несколько фрагментов "назад-назад" или фрагментов фильма MPEG-4. Каждый кусок имеет свой собственный обманный атом - так что в файле есть несколько атомов-обманов, а не один moov в конце, как в случае безфрагментального mp4. Это облегчает поток по медленным сетям, в которых задействована буферизация.
Существует несколько таких инструментов, как mp4box, которые преобразуют нормальный mp4 в фрагментированный. К сожалению, мы не можем использовать что-то вроде этого
ffmpeg <options to output mp4> | mp4box
так как ffmpeg не производит вывод для поиска при создании контейнеров mp4.
Ответы
Ответ 1
Это должно сделать трюк:
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 устанавливает для Doc как длительность как tkhd
, так и mdhd
для 0xffffffff для каждого трека. Это вызывает проблемы у некоторых игроков (например, Quicktime не будет воспроизводить такие файлы). Вы должны найти инструмент и изменить его на ноль (0x00000000).
Ответ 2
ОБНОВЛЕНИЕ: Рассмотрение фрагментированного 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
Ответ 3
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 имеет некоторую (плохо документированную) поддержку для них.
Ответ 4
Возможно, это поможет. В приведенном ниже примере ffmpeg берет COPY канала RTMP, а затем использует ffmpeg, он создает HTTP-выход в fMP4, который может быть принят точками входа IIS или Azure.
Примечание: исходный кодер установлен на интервал ключевого кадра в 2 секунды.
"ffmpeg -i rtmp://ip сервера: 1935/name/streamkey -vcodec copy -acodec copy -nal-hrd cbr -movflags isml + frag_keyframe + separate_moof -f ismv http://url точки входа /entry -point.isml/Streams (feed1)"