2017-12-29 101 views
3

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 초

+0

이 메모리 페이지와 같은 감정은 캡처 장치의 phisical 버퍼에 대한 링크 일뿐입니다. USB 3.0 와이어의 다른 쪽. 그리고 memcpy 때마다 USB 연결 inits 데이터의 일부를 복사하고 다음 그것을 닫습니다. – nefton

+0

렌더러 앞에 티 필터를 삽입하려고한다면? 그런 다음 두 번째 핀에서 비디오 데이터를 덤프 할 수 있습니다. –

+0

감사합니다. 내 그래프에서 필터를 열거하고 capturepraphbuilder2가 2 개의 필터를 추가하는 것을 확인했습니다. 스마트 티 및 AVI 압축 해제 기. AVI Decompessor가 아무 것도하지 않는 이상한 점이 있습니다. 입력 및 출력 형식은 동일합니다 (yuy2). 그러나 나는 그것의 첫 번째 핀을 발견 버퍼를 얻을 그것은 비디오 메모리에, 그래서 수동으로 미리 정의 된 LUT 테이블에 의해 RGB32 매우 빠른 (<0.01s) yuy2 압축을 풉니 다. – nefton

답변

1

비디오 메모리가 자연 상태로 다시 읽는 것이 느립니다 (예 : VMR9 IBasicVideo->GetCurrentImage very slow 및 다른 참조 자료를 찾을 수 있음). 일반적으로 실제로 비디오 메모리에 도달하기 전에 데이터를 가져 오려고합니다.

또한 데이터를 읽는 방법은 신뢰할 만하지 않습니다. 실제로 어떤 프레임을 복사하고 있는지 알지 못하며, 심지어 검은 색이나 가비지를 읽거나, 버퍼에 대한 획득 액세스로 메인 비디오 스트리밍을 멈출 수도 있습니다. 이는 특정 비디오 프레임에 해당하는 버퍼가 아닌 사용 가능한 버퍼 풀에서 사용되지 않은 버퍼를 가져 오기 때문입니다. 이러한 버퍼에서 이미지를 가져 오는 것은 이전에 스트리밍 된 프레임의 사용되지 않은 데이터가 초기화되고 아직 다른 것으로 덮어 쓰여지지 않는 허약 한 가정에서 발생합니다.

+0

비디오 메모리는 [시스템 메모리에] 쓰여지는 속도가 빠르며 다시 느리게 읽습니다. –

+0

비디오 메모리의 본질? 당신은 비디오 카드에 phisical 한 기억을 의미하고 그것을 복사하는 데 많은 문제가 있습니까? 이제 제대로 작동합니다. monitor1에서 데이터를 가져 와서 monitor2에 표시합니다. 이제 지연은 약 0.1 초입니다. 하지만 다른 필터 지연을 추가하면> 0.5 초가됩니다. 분석하기 위해 초당 하나의 프레임 만 있으면됩니다. (비동기적일 수 있음) 다른 모든 59 프레임은 가능한 빨리 표시되어야합니다. (<0.1 초 지연) – nefton

+0

USB에서 직접 비디오 메모리에 기록한다고 생각하십시오. – nefton