これは本当に私の髪を引っ張っています。CTransformFilter から派生した DirectShow 変換フィルターを作成しました。CTransformInputPin から入力ピンを派生させました。入力ピンの Receive メソッドが呼び出されると、IMediaSample のプレゼンテーション時間がファイルに記録されます。グラフを停止して再度開始するまで、これはすべて正常に機能します(MSのgraphedtを使用しています)。ほとんどの場合、再実行しても問題はありません。しかし、グラフを停止してから再度実行する回数の約 10 分の 1 で、プレゼンテーションの開始時間がマイナスになります。グラフが実行されると、最終的にはゼロまで増加し、ゼロを超えますが、ストリーム時間に追いつくことはなく、その結果、ストリーム時間はすべてのサンプルのプレゼンテーション開始時間よりも大幅に遅れたままになります。
Logitech Webcam Pro 9000 と Logitech C600 カメラでこれを確認しましたが、Winbook カメラでは確認できませんでした。したがって、これが Logitech の問題であるかどうか疑問に思っています。停止して再度実行した後、ビデオ IMediaSamples で負のプレゼンテーション時間を見た人はいますか? (IMediaSample のプリロール フラグを確認しました。常に S_FALSE です。)
アップデート:
CTransformFilter の (実際には、CBaseFilter の) Run メソッドを次のようにオーバーライドしました。
STDMETHODIMP MyTransformFilter::Run(REFERENCE_TIME tStart)
{
char buff[1000];
REFERENCE_TIME rTime;
m_pClock->GetTime(&rTime);
sprintf(buff, "Run tstart = %lld, rTime = %lld", tStart, rTime);
Trace(buff); // open my log file, add buff, close my log file
return CTransformFilter::Run(tStart);
}
graphedt を使用してグラフを開始し、10 秒間実行し、5 秒間一時停止してから、再び開始しました。出力は次のとおりです。
Run tstart = 7855978550000, rTime = 7855978450000
Run tstart = 7856030610000, rTime = 7856126960000
Run に渡された 2 つの時間は、5.2 秒 (私が一時停止した時間とほぼ同じ) 異なります。2 つの参照クロック時間は、14.6 秒 (Run の呼び出し間の合計時間とほぼ同じ) 異なります。フィルター グラフ マネージャーが Run に渡される時間 (最初の呼び出しで 10 ミリ秒) に追加するわずかな増加を除いて、これらは Run が呼び出されるたびにほぼ同じであると予想されます。代わりに、2 回目の呼び出しで Run に渡される時間は、参照クロックより約 10 秒遅れています。2 番目の呼び出しで Run に渡された時間が、2 番目の呼び出しで参照クロックによって返された時間と (ほぼ) 同じではない理由を理解するのに非常に役立ちます。
更新 2:
問題は Logitech バージョン 13.31.1044.0 ドライバーにあるようです。以下の回答を参照してください。