我們正在構建一個視頻通信軟件。我們正在使用媒體基金會獲取實況流。我們使用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捕獲,並正常工作。
有人在媒體基礎上就同一問題掙扎嗎?
有趣的是,我必須仔細閱讀您的代碼示例,因爲這種方法相當令人不安,但確實很有趣。 –