3

最近、ffmpeg をトランスコーディングおよびストリーミング ツールとして使用するタスクがありました。タスクは、ファイルを特定の形式から MP4 に変換し、stdout からキャプチャすることですぐにストリーミングすることでした。ここまでは順調ですね。ストリーミングは、VLC プレーヤーだけでなく、Android タブのネイティブ プレーヤーでもうまく機能します。問題はフラッシュプレーヤーにあります。次のエラーが発生します。

NetStream.Play.FileStructureInvalid : Adob​​e Flash は、無効なファイル構造を持つファイルをインポートできません。

使用されるffmpegフラグは

$ ffmpeg -loglevel quiet -i somefile.avi -vbsf h264_mp4toannexb -vcodec libx264 \
-acodec aac -f MP4 -movflags frag_keyframe+empty_moov -re - 2>&1
4

1 に答える 1

2

ドキュメントに記載されているように-movflags

mov/mp4/ismv マルチプレクサは、フラグメンテーションをサポートしています。通常、MOV/MP4 ファイルには、すべてのパケットに関するすべてのメタデータが 1 つの場所に格納されています (ファイルの末尾に書き込まれますqt-faststart。ツールを使用して、再生を改善するために先頭に移動できます)。フラグメント化されたファイルは、パケットとこれらのパケットに関するメタデータが一緒に保存される多数のフラグメントで構成されます。断片化されたファイルへの書き込みには、書き込みが中断された場合でもファイルをデコードできるという利点があり (通常の MOV/MP4 は、適切に終了しないとデコードできません)、非常に長いファイルを書き込むときに必要なメモリが少なくて済みます (通常の MOV を書き込むため)。 /MP4 ファイルは、ファイルが閉じられるまで、すべてのパケットに関する情報をメモリに保存します)。 欠点は、他のアプリケーションとの互換性が低いことです。

フラグメント化された MP4 ファイルを処理できる Flash Player に切り替えるか、ストリーミングをより適切にサポートする別のコンテナー形式を使用してください。

また、-reは入力のみのオプションであるため、出力の前ではなく、入力の前に指定する方が理にかなっています。

于 2012-07-23T19:26:56.937 に答える