如何用ffmpeg输出碎片mp4?

时间:2011-12-23 13:51:16

标签: ffmpeg mp4

ffmpeg -i infile.avi out.mp4输出非碎片MP4。

如何获得碎片mp4?

更新 片段化的mp4文件在内部分为几个背对背块或MPEG-4电影片段。每个块都有自己的moof原子 - 因此在文件中交错存在几个moof原子,而不是像未分段的mp4那样在末尾交换单个moov。这使得在涉及缓冲的慢速网络上流式传输更容易

有一些工具,如mp4box,可以将普通的mp4转换为零碎的mp4。不幸的是我们不能使用这样的东西

ffmpeg <options to output mp4> | mp4box

因为ffmpeg在生成mp4容器时不会产生可搜索的输出。

4 个答案:

答案 0 :(得分:50)

这应该可以解决问题:

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帧构成一个关键帧

要计算健康的关键帧间隔,请参阅我的流媒体服务器文档中有关fragment sizes的段落。 - 你也可以考虑使用WebM,它是H.264的免费替代品(并且在某些平台上比碎片mp4更好的支持)。

重要说明: FFMpeg的复用器会将tkhdmdhd个原子中的持续时间设置为每个曲目的0xffffffff。这会导致某些播放器出现问题(例如,Quicktime不会播放此类文件)。您应该找到一个工具并将其更改为零(0x00000000)。

答案 1 :(得分:8)

更新:将片段化的MP4视为ISMV(平滑流式传输)文件。自2012年1月27日起,新版FFMPEG 0.10能够复制到这种格式。

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

答案 2 :(得分:2)

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确实有一些(文档记录很少)支持它们。

答案 3 :(得分:2)

也许这会有所帮助。在下面的示例中,ffmpeg采用RTMP源的COPY,然后使用ffmpeg,它在fMP4中创建一个可由IIS或Azure入口点接受的HTTP输出。

注意:原始编码器设置为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)