1

我正在尝试使用“ http://directshownet.sourceforge.net/ ”中的 DirectShot.Net 包装器从多个视频文件中提取帧。

每当我运行 DxScan 示例应用程序时。我得到一个“找不到中间过滤器的组合来建立连接”。WMV 文件、MP4 文件、AVI 文件会发生这种情况。我指向示例应用程序的任何媒体。

如果我使用 GSpot 编解码器工具打开任何视频并要求它渲染图形,它会毫无问题地这样做。所以机器绝对有能力播放内容。

我在Win 7 64位。针对 x64、x86 或 Auto 会引发相同的错误。包括以管理员身份运行 Visual Studio。

我已修改示例代码以尝试找到包含以下 Romain R 建议的视频媒体类型的正确 pin。

我在用着:

            IEnumPins epins;
            capFilter.EnumPins(out epins);
            IntPtr fetched = Marshal.AllocCoTaskMem(4);
            IPin[] pins = new IPin[1];
            while (epins.Next(1, pins, fetched) == 0)
            {
                PinInfo pinfo;
                pins[0].QueryPinInfo(out pinfo);
                IEnumMediaTypes mtypes;
                pins[0].EnumMediaTypes(out mtypes);
                AMMediaType[] types = new AMMediaType[1];
                while(mtypes.Next(1, types, new IntPtr()) == 0){
                    var majorType = types[0].majorType;
                    if (majorType == MediaType.Video)
                    {
                         //This is never reached
                    }
                }
            }

对于 MP4 文件,它永远不会到达上面的注释行。但是对于 WMV 文件,演示现在可以正常运行。

据推测,这是因为它没有找到合适的 MP4 文件过滤器。这是模糊的,因为内容将在 Windows 媒体播放器中正常播放。

这是一个可能的原因吗?

4

1 回答 1

0

DxScansample 正在以不可靠的方式构建过滤器图,特别是假设它从为媒体文件提供的源过滤器中抓取的第一个 pin 是视频 pin。并非总是如此。更好的图形构建方法应该可以正常工作。您可能需要逐步了解您在哪一行有错误。最有可能的是,它将是采样采集器过滤器输入引脚的连接。

UPD。请注意,可能会发生原始过滤器没有输入引脚的情况,它需要介于两者之间的附加过滤器,即所谓的解析器/解复用器过滤器,它将流转换为视频帧和音频样本。DirectShow API 提供了Render*一些方法来帮助构建图形,建议该链的所需链接以及 DxScan 正在执行的直接连接可能会或可能不会成功。

也就是说,DxScan 可能不是最好的示例,原生 API 的 MSDN 示例/参考可能更适合使用 DirectShow。

您的游乐场和主要研究和 API 探索工具应该是来自 Windows SDK(GraphStudio 或GraphStudioNext作为替代改进选项)的 GraphEdit,而不是 DirectShow.NET 包装库示例。

这是模糊的,因为内容将在 Windows 媒体播放器中正常播放。

WMP 不使用 DirectShow 进行播放。

于 2013-02-25T15:20:54.147 回答