ffmpeg -i infile.avi out.mp4
outputs non-fragmented MP4.
How do I obtain fragmented mp4?
Update A fragmented mp4 file is internally divided into several back-to-back chunks or MPEG-4 movie fragments. Each chunk has its own moof atom - so there are several moof atoms interleaved in the file instead of a single moov at the end as in the case of an unfragmented mp4. This makes it easier to stream over slow networks where buffering is involved
There are several tools like mp4box that convert a normal mp4 to a fragmented one. Unfortunately we cannot use something like this
ffmpeg <options to output mp4> | mp4box
since ffmpeg does not produce seekable output while producing mp4 containers.
This should do the trick:
ffmpeg -re -i infile.ext -g 52 \
-c:a aac -b:a 64k -c:v libx264 -b:v 448k \
-f mp4 -movflags frag_keyframe+empty_moov \
output.mp4
frag_keyframe
causes fragmented output,empty_moov
will cause output to be 100% fragmented; without this the first fragment will be muxed as a short movie (using moov
) followed by the rest of the media in fragments,-re
is useful when live streaming (use input media frame rate), do not use it if you are creating a file,-g 52
forces (at least) every 52nd frame to be a keyframeTo calculate a healthy keyframe interval please see the paragraphs about fragment sizes in the docs of my streaming server. - You can also consider using WebM which is a free alternative to H.264 (and has better support on some platforms than fragmented mp4).
Important note: FFMpeg's muxer will set the Duration in both tkhd
and mdhd
atoms to 0xffffffff for each track. This causes problems in some players (for example Quicktime will not play such files). You should find a tool and change it to zero (0x00000000).
UPDATE: Considering a fragmented MP4 as ISMV (Smooth Streaming) file. The new version FFMPEG 0.10, since January, 27, 2012 is able to mux to this format.
$ ffmpeg -h muxer=ismv
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
Perhaps this will help. In the example below, ffmpeg takes a COPY of an RTMP feed and then using ffmpeg, it creates a HTTP output in fMP4 that can be accepted by IIS or Azure entry points.
Note: the original encoder is set to keyframe interval of 2 seconds.
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
(but not the man page) has the following:
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.
I wouldn't know how to identify a fragmented mp4 if I saw one, but it looks like ffmpeg does have some (poorly documented) support for them.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With