2011-12-20 7 views
2

DirectShow SDKのpushsourceの例に基づいてDirectShowソースフィルタを作成しようとしています。これは基本的にビットマップのセットをビデオに出力します。私はAsync_readerをWave Parserでオーディオ用に使用し、新しいフィルタでビデオをプッシュするフィルタグラフを設定しました(フィルタはCSourceStreamであり、FillBuffer関数でフレームを生成します)。これらは両方ともWMASFWriterに接続され、WMVを出力します。WMASFWriterを使用したDirectShowフィルタグラフは、ビデオが短すぎます

各ビットマップは数秒間続くことができるので、FillBuffer関数では、渡されたIMediaSampleのSetTimeを数秒間隔で開始および終了時間で呼び出しています。画面にレンダリングするときにこれはうまく動作しますが、ディスクに書き込むとファイルの長さが短すぎます。 WMVを書き込むときに最後のビットマップが無視されているように見えます(ビデオが意図された時間持続するのではなく終了すると表示されます)。これは、私のフィルタと変更されたプッシュソースフィルタ(フレームの長さが増えた)の両方の場合に当てはまります。

私はこの作業をしようとしていたときに、1つのポイントで10秒の長さの倍数ではないビデオを持つことができなかったという点で、さらに奇妙な動作を見たことがあります。私はこれが何であるかはわかりませんが、私はそれが適切であると言いたいと思います。

答えて

1

私は終了時間が単に無視されると思います。通常、ビデオサンプルは特定の時点であるため、開始時間のみがあります。ビデオにムーブメントがある場合、ムービーは流暢ですが、ビデオはちょうど時点のものです。

私は解決策は簡単だと思います。次のフレームが受信されるまで、ビデオは同じ状態を維持するので、ビデオの最後にダミーフレームを追加するだけです。直前のフレームを繰り返すことができます。

+0

ああ、もちろんです。私は終わりの時が無視されているとは考えていなかった。動画の最後にダミーフレームを追加すると、完全に機能しました。ありがとう! – Andrew

関連する問題