【发布时间】:2020-10-24 14:19:44
【问题描述】:
我在使用 MPEG1 视频和 Media Foundation 时遇到了一些问题:所以 Media Foundation 不支持播放 MPEG1 视频流 (see here),但由于某种原因,它仍然会打开它们,甚至会报告正确的持续时间和帧大小。所以在打开时,一切看起来都可以播放这些文件。
但它不能!一旦您尝试实际播放 MPEG1 视频文件,IMFAsyncCallback::Invoke() 将被调用,状态为MESessionTopologySet,然后IMFMediaEvent::GetStatus() 将返回 0xc004f011,仅此而已。
那么有没有办法检查媒体基金会在打开视频格式后是否真的可以播放它,或者有没有办法让媒体基金会只打开它可以实际播放的文件?目前我只能通过尝试开始播放来判断文件是否可以播放,然后查看它是否有效,这有点不方便。我希望能够更早地判断文件是否可以播放。
【问题讨论】:
-
构建拓扑和暂停对您解决提出的任务有用吗?我相信在
SL_E_LICENSE_FILE_NOT_INSTALLED的情况下暂停是不会成功的。 -
@RomanR.:抱歉,没有用。
IMFMediaSession::Pause在 MPEG1 文件上返回 0,即成功。 -
那么使用标准组件的下一个不错的选择可能是构建播放拓扑(带解码!)到samplegrabber sink。那么它必须在播放时失败。
-
@RomanR.:但这不会在受 DRM 保护的内容上也失败吗? AFAIR 并非所有编解码器都允许采样...
-
@RomanR.:谢谢。为简单起见,我用
IMFSourceReader代替样本采集器做了一些实验。这似乎可以解决问题。见下文,我已经发布了这个问题的答案。
标签: c++ windows winapi video ms-media-foundation