样品收集器水槽未设置媒体类型GUID

问题描述 投票:0回答:1

我正在使用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


visual-c++ ms-media-foundation
1个回答
0
投票

来自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节点等等,它不再有兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.