ffmpeg -i infile.avi out.mp4
は、断片化されていないMP4を出力します。
断片化されたmp4を取得するにはどうすればよいですか?
Update断片化されたmp4ファイルは、内部でいくつかの連続したチャンクまたはMPEG-4ムービーフラグメントに分割されます。各チャンクには独自のmoof atom-そのため、断片化されていないmp4の場合のように、最後に単一のmoovではなく、いくつかのmoofアトムがファイルにインターリーブされます。バッファリングが関係する低速ネットワーク経由
mp4box のようないくつかのツールがあり、通常のmp4を断片化されたものに変換します。残念ながら、このようなものは使用できません
ffmpeg <options to output mp4> | mp4box
ffmpegはmp4コンテナの生成中にシーク可能な出力を生成しないためです。
これでうまくいくはずです:
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フレームごとにキーフレームにする正常なキーフレーム間隔を計算するには、ストリーミングサーバーのドキュメントの fragments size に関する段落を参照してください。 -また、H.264の無料の代替であるWebMの使用を検討することもできます(一部のプラットフォームでは、断片化されたmp4よりも優れたサポートがあります)。
重要な注意:FFMpegのマルチプレクサは、各トラックのtkhd
およびmdhd
アトムの両方でDurationを0xffffffffに設定します。これにより、一部のプレーヤーで問題が発生します(たとえば、Quicktimeはそのようなファイルを再生しません)。ツールを見つけて、ゼロ(0x00000000)に変更する必要があります。
更新:断片化された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
おそらくこれが役立つでしょう。次の例では、ffmpegはRTMPフィードのCOPYを取得し、ffmpegを使用して、IISまたはAzureエントリポイントによって受け入れられるHTTP出力をfMP4で作成します。
注:元のエンコーダーは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にはいくつかの(不十分な文書化された)サポートがあるようです。