2011-07-05 9 views
3

をドロップするlibavcodecの/ ffmpegのを教えてください。 問題は、いつか(よく、ほとんどの場合)フレーム取得プロセスが十分に速くないことです。私はビデオを作成したアプリケーションを構築していますフレーム

私が現在行っていることは、私が遅ければ現在のフレーム取得をスキップすることですが、FFMPEG/libavcodecはそれを次のフレームとして渡すすべてのフレームを考慮します。したがって、2フレーム20秒のビデオは10秒しか続きません。サウンド処理が高速であるため、サウンドを追加するとすぐに多くの問題が発生します。

私はFFMPEGに伝えたいことは何でしょうか?私がリアルタイムで処理することを可能にするものがあるかどうかを判断することができます。

(私も、私は予想通り、遅くする方法だったハードドライブに私のフレームを「スタック」してみました)私はポイントでフレームをスタックしようとしたが、これはすべて私の記憶を殺して終わります

私は手動でPTSで作業する必要がありますね、しかし、すべての私の試みは失敗し、そのようなVLCなどのffmpegを使用して、いくつかの他のアプリのコードを、読んでてきた、大きな助けませんでした...ので、何かアドバイスは次のようになりとても有難い!

ありがとうございます!

答えて

0

多くの(ほとんど?)のビデオフォーマットのフレームを除外できません。代わりに、新しいビデオフレームを取得できないときに、古いビデオフレームを再利用してみてください。

+0

ほとんどのコンテナは、実際にフレームを残してサポートしています。 MP4は各フレームのデュレーションを保存するだけで、すべてのフレームで同じである必要はありません。 mkvはプレゼンテーションタイムスタンプを格納します。 IDKについてavi;おそらくそうではないかもしれませんが、AVIは現代のコーデックにとって理想的ではありません。 (多くの汎用ビデオコンテナではなく、ogmのようなあいまいなものを数えないか、ナットのようなものを本当にあいまいにします) –

0

ジャストアイデア...それはあなたが再びそれに同じフレームを渡す(および現在の1をドロップ)しようとした処理で遅れていたときに?おそらく、それは迅速に複製されたフレームを処理することができます。

+0

これはちょっと改善しますが、ビデオはまだ速すぎます... 私はこれを推測します私のスケジューリングアルゴリズム(私はアルゴリズムをtrully正直に呼ぶことはできません...) 明日は改善して、何か改善があれば投稿してみます。 何とか助けてくれてありがとう(あなたとduskwuffの両方)! – chouquette

0

マルチコア処理用にこのffmpegコマンドラインスイッチ-threads ...があるので、APIに似たようなことができるはずです(ただし、どう考えてもわかりません)。これはあなたの問題を解決するかもしれません。

1

あなたの出力は、おそらく、可変フレームレート(VFR)とみなされますが、あなたは、単にフレームが到着したときに壁時計の時間を利用してタイムスタンプを生成し、それをコードする前に、あなたのAVFrameにそれを適用することができます。再生時にフレームが正しい時刻に表示されます。これを行う方法の例については

(少なくとも、あなた自身のタイムスタンプ部分を指定)、ffmpegの分布(私の現在のgitのプルの行491)でのdoc /例/ muxing.cを参照してください。

frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base); 

ここで著者は、ビデオストリームのタイムベースに再スケーリングビデオコーデックのタイムベースで1フレームのタイムスタンプをインクリメントされていますが、あなたの出力ビデオストリームのに任意のタイムベースからフレームをキャプチャし始めて以来、あなたのケースであなたは、単に秒数を再スケールすることができますタイムベース(上記の例のように)あなたの任意のタイムベースは1/1000である、とあなたがキャプチャ開始0.25秒以降のフレームを受信した場合、たとえば、その後、次の操作を行います。

AVRational my_timebase = {1, 1000}; 
frame->pts = av_rescale_q(250, my_timebase, avstream->time_base); 

は、いつものようにフレームを符号化します。

関連する問題