我正在开发一个桌面应用程序,使用 MediaSession 从USB摄像头录制视频和流。我已经实现了捕获视频和音频。此外,在我的应用程序中实现了播放/暂停/停止演示状态,但是我在从暂停状态恢复视频后面临问题。
使用 IMFMediaSession :: Start 方法,我已从暂停状态恢复视频捕获。调用此方法后,预览中存在太多延迟。恢复视频录制后,媒体样本排队。
我创建了异步媒体会话。请查找以下代码段
HRESULT SetTopologyFunc()
{
hr = MFCreateMediaSession(NULL, &m_pMediaSession); if(FAILED(hr)) { return hr; }
if(m_pMediaSession != NULL)
{
hr = m_pMediaSession->BeginGetEvent((IMFAsyncCallback*)this, NULL); if(FAILED(hr)) { return hr; }
}
// Create a blank topology
hr = MFCreateTopology(&pTopology); if(FAILED(hr)) { return hr; }
// Set the topology on the media session.
hr = m_pMediaSession->SetTopology(MFSESSION_SETTOPOLOGY_IMMEDIATE, pTopology); if(FAILED(hr)) { return hr; }
}
HRESULT StartPlayback()
{
HRESULT hr = S_OK;
PROPVARIANT varStart;
PropVariantInit(&varStart);
varStart.vt = VT_EMPTY;
hr = m_pMediaSession->Start(&GUID_NULL, &varStart); if (SUCCEEDED(hr)) { m_state = Started; }
PropVariantClear(&varStart);
return hr;
}
HRESULT CResumeVideoCapture()
{
HRESULT hr = S_OK;
if (m_state != Paused && m_state != Stopped) { return MF_E_INVALIDREQUEST; }
if (m_pMediaSession == NULL || m_pMediaSource == NULL) { return E_UNEXPECTED; }
hr = StartPlayback();
return hr;
}
HRESULT CStopVideoCapture()
{
if (m_state != Started && m_state != Paused) { return MF_E_INVALIDREQUEST; }
if (m_pMediaSession == NULL || m_pMediaSource == NULL) { return E_UNEXPECTED; }
HRESULT hr = m_pMediaSession->Stop(); if (SUCCEEDED(hr)) { m_state = Stopped; }
return hr;
}
HRESULT CPauseVideoCapture()
{
if (m_state != Started) { return MF_E_INVALIDREQUEST; }
if (m_pMediaSession == NULL || m_pMediaSource == NULL) { return E_UNEXPECTED; }
HRESULT hr = m_pMediaSession->Pause(); if (SUCCEEDED(hr)) { m_state = Paused; }
return hr;
}
我已经尝试过IMFSourceReader技术一起捕获视频和音频,但我无法将两者结合起来。出于这个原因,我转向媒体会话技术。一切正常,但我无法控制演示状态。
要刷新toplogy中的排队示例,我已尝试使用MFSESSION_SETTOPOLOGY_CLEAR_CURRENT方法 IMFMediaSession :: ClearTopologies 和 IMFMediaSession :: SetTopology ,然后再继续录制。
您可以指导我在媒体会话中录制视频时控制演示文稿状态吗?