0

我正在尝试使用 IMFSourceResolver::CreateObjectFromByteStream 方法为受 DRM 保护的 WMA 文件创建 IMFMediaSource 实例。我正在将 Windows SDK 中的 ProtectedPlayback 示例改编为游乐场。我希望实现的最终目标是让播放过程由自定义实现提供,如果我将编写 IMFByteStream。

但是,我无法让我的简单 IMFByteStream 实现或 MFCreateFile 函数返回的实现工作。当传递给 CreateObjectFromByteStream 时,每个都返回 MF_E_UNSUPPORTED_BYTESTREAM_TYPE 的 HRESULT。

我使用受 DRM 保护的 WMA 文件测试了默认状态下的示例项目(在文件上使用 CreateObjectFromUrl),它运行良好。文件未损坏且许可证有效。我不明白为什么用 CreateObjectFromByteStream( MFCreateFile() ) 替换这段代码不起作用。我几乎找不到涵盖使用自定义字节流或解析器对字节流实例的期望的文档。

如果有人对这些东西有任何经验或知道我做错了什么,将不胜感激。

我正在使用的代码在这里:

IMFByteStream* stream = NULL;

HRESULT hr2 = MFCreateFile(
    MF_ACCESSMODE_READ,
    MF_OPENMODE_FAIL_IF_NOT_EXIST,
    MF_FILEFLAGS_NONE,
    L"C:\\IFB.wma",
    &stream);


CHECK_HR(hr = pSourceResolver->CreateObjectFromByteStream(
                stream,
                NULL,
                MF_RESOLUTION_MEDIASOURCE,
                NULL,
                &ObjectType,
                &pSource));

我没有包括整个东西,因为它与示例基本相同,我只更改了这一部分。

谢谢,

史蒂夫

4

2 回答 2

2

@pisomojado

感谢您的回复,我完全忘记了我已经发布了这个问题。

问题是,如果我没记错的话,CreateObjectFromByteStream 需要一种方法来识别内容类型。您可以通过传入 URL 以及字节流实例(pwszURL 参数)或通过使字节流类实现 IMFAttributes 并处理对请求内容类型的 GetAllocatedString 的调用来执行此操作。由于我没有做这些事情,解析器只是拒绝了流。

我原以为解析器会尝试通过前几个字节来识别流内容类型,就像您在答案中建议的那样,但对我来说似乎没有这样做。不知道为什么会这样,但没关系。

史蒂夫

于 2010-08-25T09:46:15.363 回答
1

调试这里发生的事情的一些想法:

首先,IMFSourceResolver::CreateObjectFromUrl在你的 c:\ifb.wma 文件上做一个;确保这是快乐的。

假设是这样,那么接下来就是在 CreateObjectFromByteStream 调用中查看 IMFByteStream 中发生的情况。通常,CreateObjectFromByteStream 将尝试从 IMFByteStream 的开头读取几个字节,因为那里通常有某种识别字节序列。设置一些断点或做一些日志记录,IMFByteStream::[Begin]Read看看你被要求什么,以及你是否忠实地传递了正确的字节。

FWIW,所有 WMA 文件(以及 WMV 和 ASF)都是这样开始的(它是 ASF 标头 GUID)。

30 26 b2 75 8e 66 cf 11 a6 d9 00 aa 00 62 ce 6c
于 2010-08-24T13:59:28.223 回答