FFMPEGライブラリを使用してAACオーディオストリームをmp4ファイルに書き込もうとしています。私はioContext->seekable = 0
を設定する必要があるので、ソケットに直接書き込むカスタムIOコンテキストを使用しています。この作業を行うために、ヘッダを書き込むときに "movflags" empty_moov
とfrag_keyframe
を追加しなければなりませんでした。シーク可能なAACオーディオストリームをFFMPEGでMP4ファイルに書き込む
出力をソケットの反対側のファイルに書き込んだ後、VLCまたはWindows Media Playerでファイルを再生できます。ただし、ファイル内の特定の位置を探すことは、両方のプレーヤーで正しく機能していません。また、WMPは合計時間を表示せず、VLCは音声の最後に近づくとすぐに点滅します。
マルチプレクサでメタデータを追加する方法はありますか?プレーヤはファイルをストリームとして書き込まないように扱うことができますか?ソケット経由での転送は突然中断されないので、ファイルの最後にメタデータを書き込むことができます。私はまた、事前に合計期間を知っているので、可能ならばファイルのヘッダーに追加することができます。 faststart
フラグを使用することはできません。これは、ソケットに書き込む前にシーク可能なファイルに出力する必要があるためです。
アップデート:私はAVFormatContext
に期間を設定することができると私はAVStream
にnb_frames
とavg_frame_rate
を設定することができることを学びました。しかし、それは私の問題を解決しません。 codecContextフラグAV_CODEC_FLAG_QSCALE
を設定すると、VLCは合計時間を見積もることができます。しかし、依頼はまだ動作しません。
この** [リンク](http://www.bogotobogo.com/VideoStreaming/ffmpeg_AdaptiveLiveStreaming_SmoothStreaming.php)**あなたがMOVフラグ(ワード検索であなたの問題を理解するのに役立つかもしれません: '-movflagsはempty_moov'と読みますセクションの残りの部分)。あなたは問題を説明しましたが、アプリケーションのコンテキストは何ですか?あなたはオーディオを受信しているし、Xの金額がファイルに保存されるまでMP4を構築したいですか?まず、必要なAACをすべてバッファリングしてから最終的なMP4にエンコードするのはなぜですか? #すべてのオーディオフレームはキーフレームです。#MPEGデコーダはメタデータがない場合は検索できません。#M4aの出力を試してからMP4として名前を変更しますか? –
PS:私はFFmpegをプロセスとして(直接インポートされたライブラリではなく)慣れていますが、実行中のプロセスとして 'ffmpeg -i - -c:libfdk_aac -b:128k output.mp4'を使用します。 '-i -'を使って入力ファイルがないことを知らせ、プロセスを終了して再生可能なAACの終わりまで各AACフレームのバイトを' process.writeBytes(myAACframe); 'に繰り返し書きます要するに、利用可能なAACフレームを追加することによって、動的に構築されたMP4ファイル。その論理の何かがあなたを助けることができるでしょうか? –
回答がないと、100ポイントを燃え尽きさせる代わりに、ただ応答しないでください。他の人があなたを助けてくれたコメントを追加することができます。シーク可能なMP4ファイルが必要な場合は、メタデータを持っていることを確認してください**それは** MPEGデコーダを求めるための必需品です。 (これは、問題に追加するので、 '-movflags empty_moov&frag_keyframe'を失うことを意味します)。私はあなたの完全なコードが適切かどうか心配することなく、簡単なテストである(例: 'nb_frames'など)、" process "メソッドを提案しました。あなたの言語に応じて、C++、Java、またはC#で行うことができます。 –