投稿がかなり古いことは承知していますが、同じ問題を抱えている人々を助けることができることを願っています(私はやったばかりです)...
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 など) を使用している場合は、もちろんそれらを使用する必要があります。