使用媒体会话进行视频录制会导致流式传输滞后

时间:2017-06-06 10:22:37

标签: c++ video-streaming video-capture audio-recording ms-media-foundation

我正在开发一个桌面应用程序,使用 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 ,然后再继续录制。

您可以指导我在媒体会话中录制视频时控制演示文稿状态吗?

0 个答案:

没有答案