【发布时间】:2014-11-18 10:50:09
【问题描述】:
我想使用IMFSourceReader 打开一个视频文件,以将其帧作为 IMFSample 访问。
在 WinRT C++ 类中,我发送视频文件的 RandomAccessStream 并使用以下代码创建 IMFSourceReader 对象。
HRESULT hr = S_OK;
ComPtr<IMFSourceReader> pSourceReader;
ComPtr<IMFByteStream> spByteStream;
if (SUCCEEDED(hr))
{
// Initialize the Media Foundation platform.
hr = MFStartup(MF_VERSION);
hr = MFCreateMFByteStreamOnStreamEx((IUnknown*)InputVideoStream, &spByteStream);
ComPtr<IMFAttributes> Atrr;
hr = MFCreateAttributes(&Atrr, 10);
hr = Atrr->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, true);
hr = MFCreateSourceReaderFromByteStream(spByteStream.Get(), Atrr.Get(), &pSourceReader);
}
但是函数 MFCreateSourceReaderFromByteStream() 的 HRESULT 正在返回 The Byte Stream Type of the Given URL is unsupported。
我不知道我做错了什么。谁能告诉我正确的方法?我使用的是 Windows 8.1。
【问题讨论】:
-
返回码听起来很清楚。您要播放的文件的视频/音频格式是什么?如果您也无法使用 TopoEdit 播放它,那么您没有此格式的可用编解码器。
-
我可以打开一些 MP4 文件(编解码器 ID isom),但不能打开每个 MP4 文件(例如编解码器 ID mp42)。除了使用 IMFSourceReader 之外,还有其他方法可以提取视频帧吗?
标签: video windows-runtime c++-cx ms-media-foundation