우리는 비디오 통신 소프트웨어를 제작하고 있습니다. 우리는 라이브 스트림을 얻기 위해 Media Foundation을 사용하고 있습니다. 우리는 IMFSourceReadder를 사용하여 캡처를 수행합니다.미디어 기반 웹캠 라이브 캡처가 저조도에서 멈춤
처럼 호출의 순서가 같습니다
hr = pAttributes->SetString(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, m_pwszSymbolicLink);
hr = MFCreateDeviceSourceActivate(pAttributes, &avdevice);
hr = avdevice->ActivateObject(__uuidof(IMFMediaSource), (void**) &m_mediaSource);
hr = m_mediaSource->CreatePresentationDescriptor(&pPD);
hr = pPD->GetStreamDescriptorByIndex(m_streamIdx, &fSelected, &pSD);
hr =
// we select the best native MediaType enumerating the source reader
pHandler->SetCurrentMediaType(m_bestNativeType);
hr = pAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, FALSE);
hr = pAttributes->SetUINT32(MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING, TRUE);
hr = MFCreateSourceReaderFromMediaSource(m_mediaSource, pAttributes, &m_reader);
그런 다음 우리는 우리가 그것을 장치를 중지하거나 다시 구성해야하는 경우
m_reader->ReadSample()
사용하여 별도의 스레드에서 동 기적으로 프레임을 읽기 시작, 우리 스레드를 중지하십시오 (플래그를 설정하고 스레드를 종료하여). 우리는 다음을 호출합니다
hr = m_mediaSource->Stop();
m_mediaSource->Shutdown();
SafeRelease(&m_mediaSource);
SafeRelease(&m_reader);
소프트웨어는 호출 할 수 있습니다. 거기에서 VGA 형식의 웹캠 비디오를 캡처하여 화면에 표시합니다. 통화 중, 관련 통화 품질에 따라 최상의 캡처 형식을 선택하고 캡처를 다시 시작합니다.
우리가 겪고있는 문제는 다음과 같습니다. 일부 카메라는 낮은 조명 조건 (낮은 fps 출력)에서 때때로 고정됩니다. 통화 시작시 또는 통화 중에 즉시 발생할 수 있습니다. 이 정지 할 때
, 두 가지 중 하나는 (
m_reader-> ReadSample() MF_E_OPERATION_CANCELLED 오류 코드와 함께 반복적으로 실패
m_reader-> ReadSample (어느 확실하지) 일어날 수있다)는 초당 80 프레임 이상을 생성하여 동일한 고정 이미지를 생성합니다.
우리가 끊을 때 장치는 VGA 캡처로 다시 구성되어 정상적으로 작동합니다.
누군가가 동일한 문제로 인해 Media Foundation에 어려움을 겪었습니까?
재미있는 점은 접근법이 상당히 당황 스럽지만 확실히 흥미 롭기 때문에 코드 샘플을 철저히 읽어야합니다. –