1

一部の入力ビデオデバイスから生のフレームを受信するプロジェクトに取り組んでいます。FFMPEGライブラリを使用してこれらのフレームをビデオファイルに書き込もうとしています。入力ソースから取得するフレームレートを制御できません。このフレームレートは実行時にも異なります。今私の問題は、録画したビデオと今後のビデオをどのように同期するかです。FFMPEGで設定したフレームレートと、録画したビデオの再生を受信する実際のフレームレートに応じて、入力ビデオよりも高速または低速になります。次のリンクに従って、エンコードされたビデオにタイムスタンプ(numOfFramesとして)を追加しようとしましたが、それは役に立ちませんでした。

ffmpegの速度エンコーディングの問題

両方を同期する方法を教えてください。FFMPEGまたはマルチメディアライブラリを使用するのはこれが初めてなので、例を高く評価します。

これらのフレームをキャプチャするためにdirectshowISampleGrabberインターフェイスを使用しています。ありがとうございました

4

1 に答える 1

1

だから最後に私はこれを行う方法を理解しました。方法は次のとおりです。

最初に、フレームにタイムスタンプを与えないソースフィルターのPREVIEWピンからプレビューを取得していました。したがって、ソースフィルターのキャプチャピンからフレームを取得する必要があります。コールバック関数よりも、SampleCBを使用して時間を取得することはできませんIMediaSample::GetTime()。ただし、この関数は100ns単位で時間を返します。FFMPEGは1/time_baseの単位でそれを必要とします。ここで、time_baseは望ましいフレームレートです。したがって、directshowのタイムスタンプは最初にFFMPEG単位で変換する必要があります。AVFrame::ptsffmpegの変数にptsを設定できるより。考慮する必要があるもう1つのことは、ビデオshoulの最初のフレームのタイムスタンプがFFMPEGで0であるため、directshowタイムスタンプからFFMPEGタイムスタンプに変換するときに注意する必要があることです。

ありがとうございました

于 2012-10-06T06:56:54.603 に答える