5

これまで、ffmpeg を使用して (プログラムで) 固定フレームを使用してすべてのエンコードを行っていました。ここで、可変フレーム レートをサポートする必要があります。フレームレートを設定しているコードの部分にコメントすることから始めました。しかし、それは機能していません。関数が avcodec_open2 で失敗しています。可変フレームレートをサポートする方法を教えてください。また、すべてのコーデックが可変フレーム レートをサポートしているわけではないことも知りました。可変フレームレートでエンコードする場合、通常どのコーデックが使用されますか。提案してください。

ありがとうプラディープ

4

1 に答える 1

7

投稿がかなり古いことは承知していますが、同じ問題を抱えている人々を助けることができることを願っています(私はやったばかりです)...

fps フィルターまたはフレームレート フィルターを使用します。同様にffpmeg n00bであるため、100%の正確さを保証するものではありませんが、少なくともこれは私にとってはうまくいきました:

filtering_video.cの例と同じようにフィルターグラフを作成しました。のfilters引数にはavfilter_graph_parse_ptr、例えば を指定fps=fps=30:round=nearしました。次に、フレームを取得するたびにフィルターグラフにフレームをフィードし、pts を次のように計算します。

float fps = (float)( codecContext->time_base.num ) / codecContext->time_base.den;
this->frame->pts = (__int64)( ( timestamp - timestamp0 ) / fps );

ここtimestampで、 はフレームの時間 (秒単位timestamp0) で、最初のフレームが記録された時間です。どちらも浮動小数点値で、カスタム ビルド タイマーの結果です。キャプチャしたフレームのタイムスタンプを提供するライブラリ (DirectShow など) を使用している場合は、もちろんそれらを使用する必要があります。

于 2016-03-14T13:01:53.937 に答える