【发布时间】:2019-08-02 01:46:48
【问题描述】:
我正在尝试将 Microsoft“CaptureEngine 视频捕获示例”代码从 Visual C++ 转换为 Embarcadero C++ Builder。
https://code.msdn.microsoft.com/windowsdesktop/Media-Foundation-Capture-78504c83
代码在 Visual C++ 上运行良好,但我需要包含在 C++ Builder 应用程序中。我基本上可以运行代码,但有几个问题需要帮助。
我可以选择视频源,预览视频源,甚至开始捕获到文件。然而,即使音频被正确录制,视频捕获文件仅包含在视频长度内重复的一帧。
我想知道这是否是由于事件处理不当造成的。 来自媒体基础捕获引擎的事件使用 Windows 消息传递到主线程,然后调用媒体引擎事件处理程序。但是我注意到事件处理程序停止录制并停止预览使用等待结果
void WaitForResult()
{
WaitForSingleObject(m_hEvent, INFINITE);
}
HRESULT CaptureManager::StopPreview()
{
HRESULT hr = S_OK;
if (m_pEngine == NULL)
{
return MF_E_NOT_INITIALIZED;
}
if (!m_bPreviewing)
{
return S_OK;
}
hr = m_pEngine->StopPreview();
if (FAILED(hr))
{
goto done;
}
WaitForResult();
if (m_fPowerRequestSet && m_hpwrRequest != INVALID_HANDLE_VALUE)
{
PowerClearRequest(m_hpwrRequest, PowerRequestExecutionRequired);
m_fPowerRequestSet = false;
}
done:
return hr;
}
问题是,这个 m_hEvent 是从 C++ Builder 事件处理程序触发的,它是等待处理事件的同一主线程的一部分,所以当我试图停止视频录制时,我得到了一个线程锁。如果我注释掉该行,我不会锁定,但我也不会得到有效的录制视频文件。
我不确定 Visual C++ 如何将事件与 Capture 引擎代码分开,有什么建议可以为 C++ Builder 做到这一点吗?
【问题讨论】:
标签: c++ video-capture ms-media-foundation