我正在尝试使用“http://directshownet.sourceforge.net/”中的DirectShot.Net包装器从多个视频文件中提取帧。
每当我运行DxScan示例应用程序时。我得到一个“没有找到中间过滤器的组合来建立连接。”这适用于WMV文件,MP4文件,AVI文件。我指向示例应用程序的任何媒体。
如果我使用GSpot编解码器工具打开任何视频并要求它渲染图形,那么它没有问题。所以机器肯定能够播放内容。
我在Win 7 64位上。针对x64,x86或Auto引发了同样的错误。包括以管理员身份运行Visual Studio。
我修改了示例代码,尝试找到包含下面Romain R建议的视频媒体类型的正确引脚。
我正在使用:
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媒体播放器中播放得很好,这一点很模糊。
这可能是原因吗?
答案 0 :(得分:0)
DxScan
示例正在以不可靠的方式构建过滤器图,特别是假设它从为媒体文件提供的源过滤器获取的第一个引脚是视频引脚。情况并非总是如此。一个更好的图形构建方法应该很好。您可能需要逐步查看错误行。最有可能的是,它将连接Sample Grabber Filter输入引脚。
UPD。请注意,原始滤波器可能没有输入引脚,它需要额外的滤波器,所谓的解析器/解复用器滤波器将流转换为视频帧和音频样本。 DirectShow API提供Render*
方法来协助构建图形,以建议此链的所需链接和DxScan正在执行的直接连接可能会或可能不会成功。
也就是说,DxScan可能不是最好的样本,本地API的MSDN样本/参考可能更适合使用DirectShow开始。
您的游乐场和主要研究和API探索工具应该是来自Windows SDK的GraphEdit(GraphStudio,或GraphStudioNext作为备用改进选项),而不是DirectShow.NET包装库示例。
因为内容在Windows媒体播放器中播放得很好,所以这是模糊不清的。
WMP不使用DirectShow进行播放。