ビデオ通信ソフトウェアを構築しています。私たちは、Media Foundationを使用してライブストリームを取得しています。 IMFSourceReadderを使用してキャプチャを実行します。Media Foundation Webcamライブキャプチャは低照度でフリーズします
呼び出しのシーケンスは次のようになります。
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出力)で時々カメラが凍結することがあります。通話の開始時または通話中にすぐに実行できます。それがフリーズしたとき
、2つのうちの1つは、(
m_reader-> ReadSample()MF_E_OPERATION_CANCELLEDエラーコードで繰り返し失敗し
m_reader-> ReadSample(どちらかわからない)発生する可能性があります)は、1秒間に80フレーム以上を生成し、同じ固定画像を生成します。
私たちが電話を切ると、デバイスはVGAキャプチャに再設定されて正常に動作します。
誰かが同じ問題でMedia Foundationに苦労しましたか?
興味深いことに、アプローチが非常に紛らわしいが、確かに興味深いので、コードサンプルを徹底的に読む必要があります。 –