【发布时间】:2016-09-19 20:07:39
【问题描述】:
我们正在构建一个视频通信软件。我们正在使用 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 发生争执吗?
【问题讨论】:
标签: c++ webcam video-capture ms-media-foundation