2017-12-29 99 views
3

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秒

+0

このメモリページのような気持ちは、キャプチャデバイスのphisicalバッファへのリンクに過ぎません。 USB 3.0ワイヤの反対側。そしてmemcpyは、USB接続中のデータの一部をコピーして閉じます。 – nefton

+0

レンダラーの前にティーフィルターを挿入しようとしたら?その後、2番目のピンからビデオデータをダンプしようとすることができます。 –

+0

ありがとうございます。自分のグラフにフィルタを列挙し、capturepraphbuilder2が2つのフィルタを追加していることを確認しました。スマートティーとAVIデコンプレッサー。 AVI Decompessorは何もしないというのは奇妙なことです。入力形式と出力形式は同じです(yuy2)。しかし、私はそれの最初のピンを見つける、バッファを取得し、それはビデオメモリではなかったので、私は手動で事前定義されたLUTテーブルによって非常に高速(<0.01s)RGB32にyuy2を解凍します。 – nefton

答えて

1

ビデオメモリの性質上、読み込みが遅くなる可能性があります(例:VMR9 IBasicVideo->GetCurrentImage very slow、他の参考文献があります)。通常、実際にビデオメモリに達する前にデータを取得する必要があります。

さらに、データを読み取る方法はあまり信頼できません。あなたは実際にどのフレームをコピーしているのかわからないし、黒色やゴミを読むことさえ起こるかもしれませんし、逆にバッファへのアクセスがメインビデオストリーミングをフリーズさせます。これは、特定のビデオフレームに対応するバッファではなく、使用可能なバッファのプールから未使用のバッファを取得しているためです。このようなバッファからイメージを取得すると、以前にストリーミングされたフレームの未使用データが初期化され、まだ他のものによって上書きされていないという脆弱な前提が生じます。

+0

ビデオメモリは、[システムメモリに]読み書きするのが速く、読み込み速度が遅くなります。 –

+0

ビデオメモリの性質?あなたは私のビデオカードでフィジカルな記憶を意味し、そこからコピーするには多くの問題がありますか?今それは正常に動作します。私はmonitor1からデータを取得し、それをmonitor2に表示します。今の遅延は約0.1秒です。しかし、他のフィルタ遅延を加えれば、0.5秒以上になります。私はそれを分析するために1秒間に1フレームしか必要ありません(非同期であるかもしれません)他の59フレームはできるだけ早く表示する必要があります。 (<0.1秒遅れ) – nefton

+0

それはusbから直接ビデオメモリに書き込むと思う。 – nefton

関連する問題