web-dev-qa-db-ja.com

ffmpegで断片化されたmp4を出力するには?

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コンテナの生成中にシーク可能な出力を生成しないためです。

43
S B

これでうまくいくはずです:

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)に変更する必要があります。

53
vbence

更新:断片化された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
8
Wagner Patriota

おそらくこれが役立つでしょう。次の例では、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)
2
thetommy2

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にはいくつかの(不十分な文書化された)サポートがあるようです。

2
blahdiblah