USB 3.0 HDMI 캡처 장치가 있습니다. YUY2 형식 (픽셀 당 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;
}
이 버퍼를 사용하는 다른 모든 작업도 매우 느립니다.
하지만 다른 데이터 (예 : 동일한 크기 4MB의 클래스 2 개)에 memcpy
을 사용하면 매우 빠릅니다. < 0.01 초
이 메모리 페이지와 같은 감정은 캡처 장치의 phisical 버퍼에 대한 링크 일뿐입니다. USB 3.0 와이어의 다른 쪽. 그리고 memcpy 때마다 USB 연결 inits 데이터의 일부를 복사하고 다음 그것을 닫습니다. – nefton
렌더러 앞에 티 필터를 삽입하려고한다면? 그런 다음 두 번째 핀에서 비디오 데이터를 덤프 할 수 있습니다. –
감사합니다. 내 그래프에서 필터를 열거하고 capturepraphbuilder2가 2 개의 필터를 추가하는 것을 확인했습니다. 스마트 티 및 AVI 압축 해제 기. AVI Decompessor가 아무 것도하지 않는 이상한 점이 있습니다. 입력 및 출력 형식은 동일합니다 (yuy2). 그러나 나는 그것의 첫 번째 핀을 발견 버퍼를 얻을 그것은 비디오 메모리에, 그래서 수동으로 미리 정의 된 LUT 테이블에 의해 RGB32 매우 빠른 (<0.01s) yuy2 압축을 풉니 다. – nefton