USB 3.0 HDMIキャプチャデバイスがあります。 YUY2形式(1ピクセルあたり2バイト)と1920x1080解像度を使用します。DirectShowのデータコピーがあまりにも遅い
ビデオキャプチャ出力ピンは、ビデオレンダリング入力ピンに直接接続します。 すべてがうまくいきます。それは私の1920x1080フリーズなしで表示されます。 しかし、毎秒スクリーンショットを作成する必要があります。これは私が行うことです:
void CaptureInterface::ScreenShoot() {
IMemInputPin* p_MemoryInputPin = nullptr;
hr = p_RenderInputPin->QueryInterface(IID_IMemInputPin, (void**)&p_MemoryInputPin);
IMemAllocator* p_MemoryAllocator = nullptr;
hr = p_MemoryInputPin->GetAllocator(&p_MemoryAllocator);
IMediaSample* p_MediaSample = nullptr;
hr = p_MemoryAllocator->GetBuffer(&p_MediaSample, 0, 0, 0);
long buff_size = p_MediaSample->GetSize(); //buff_size = 4147200 Bytes
BYTE* buff = nullptr;
hr = p_MediaSample->GetPointer(&buff);
//BYTE CaptureInterface::ScreenBuff[1920*1080*2]; defined in header
//--------- TOO SLOW (1.5 seconds for 4 MBytes) ----------
std::memcpy(ScreenBuff, buff, buff_size);
//--------------------------------------------
p_MediaSample->Release();
p_MemoryAllocator->Release();
p_MemoryInputPin->Release();
return;
}
このバッファでの他の操作も非常に遅いです。
しかし、memcpy
を私のクラスの2つの配列(例えば、同じサイズが4MBの2つの配列)に使用すると、非常に高速です。 < 0.01秒
このメモリページのような気持ちは、キャプチャデバイスのphisicalバッファへのリンクに過ぎません。 USB 3.0ワイヤの反対側。そしてmemcpyは、USB接続中のデータの一部をコピーして閉じます。 – nefton
レンダラーの前にティーフィルターを挿入しようとしたら?その後、2番目のピンからビデオデータをダンプしようとすることができます。 –
ありがとうございます。自分のグラフにフィルタを列挙し、capturepraphbuilder2が2つのフィルタを追加していることを確認しました。スマートティーとAVIデコンプレッサー。 AVI Decompessorは何もしないというのは奇妙なことです。入力形式と出力形式は同じです(yuy2)。しかし、私はそれの最初のピンを見つける、バッファを取得し、それはビデオメモリではなかったので、私は手動で事前定義されたLUTテーブルによって非常に高速(<0.01s)RGB32にyuy2を解凍します。 – nefton