我正在使用Sample Grabber Sink参考页中的示例代码,除了我正在处理mp4文件以获取音频和视频样本(我的sample code)。要处理回调中的样本,我需要知道哪些是音频,哪些是视频。问题是REFGUID guidMajorMediaType
似乎从未设置。
下面是打印每个回调样本的属性的结果。较小的样本(少于750个字节)是音频,较大的样本是视频。但是guidMajorMediaType
始终为空。是否可能需要在IMFTopologyNode's
上设置其他属性?我找不到明显的东西。
Sample Grabber test console starting...
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 0, duration = 426250, bytes = 682
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 0, duration = 416666, bytes = 353280
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 416666, duration = 416666, bytes = 353280
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 426250, duration = 463750, bytes = 742
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 833333, duration = 416666, bytes = 353280
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 890000, duration = 465000, bytes = 744
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 1250000, duration = 416666, bytes = 353280
来自Using the Sample Grabber Sink
源阅读器是Sample Grabber Sink的替代品,并且具有更简单的编程模型。
您真的需要Sample Grabber Sink吗? Source Reader是现代方法。我会说不推荐使用Sample Grabber Sink。
如果是:
文档不清晰:MFCreateSampleGrabberSinkActivate function
备注要创建样本采集卡接收器,请对ppIActivate参数中收到的指针调用IMFActivate :: ActivateObject。
在他们的示例中,“不使用样本收集器水槽”。
也许在IMFActivate上的ActivateObject之后使用IMFMediaSink,您将在OnProcessSample中获得正确的guidMajorMediaType。
这似乎是一个错误。我确认OnProcessSample为REFGUID guidMajorMediaType传递了GUID_NULL。不应这样做,因为所有其他参数似乎都有效。
我只是认为Sample Grabber Sink已过时,您不应使用它。
说明在存在其他解决方案且没有错误的情况下,为什么真正需要使用示例采集器接收器。
对我来说,“样本捕获器接收器”是DirectShow的一种方法,现在,有了MediaSession,Source Reader,Tee节点等等,它不再有兴趣。