我一直在寻找一种方法,使用VB.NET和DirectShowNET做了好几个月。感谢上周提出的问题Is there any way to control DirectShow VSFilter programmatically?,我正走在正确的轨道上,但需要帮助克服最后的障碍。
根据上述问题的答案,我可以掌握过滤器的界面并调用put_FileName()。但是,当我检查正在运行的图形中的过滤器时,文件名是垃圾或空白。以下是我加载过滤器的方法:
Dim clsidVobsub As New Guid("{93A22E7A-5091-45EF-BA61-6DA26156A5D0}")
Dim filterVobsub As IBaseFilter
Dim type__2 As Type = Type.GetTypeFromCLSID(clsidVobsub)
filterVobsub = DirectCast(Activator.CreateInstance(type__2), IBaseFilter)
Graph.AddFilter(filterVobsub, "My VobSub")
Dim vobSettings As ISettingsInterface = DirectCast(filterVobsub, ISettingsInterface)
Dim fn As String = "C:\Leta\testing.srt"
Dim hr as Integer = vobSettings.put_FileName(fn)
这似乎应该工作,所以我认为问题在于我试图在接口定义中编组函数调用的方式。
<PreserveSig()> _
Function put_FileName(<MarshalAs(UnmanagedType.LPWStr)> fn As String) As Integer
有人能看出我做错了什么吗?
编辑:ISettingsInterface是我自己的。它的声明如下:
<ComImport(), System.Security.SuppressUnmanagedCodeSecurity(), Guid("EBE1FB08-3957-47ca-AF13-5827E5442E56"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface ISettingsInterface
<PreserveSig()> _
Function get_FileName(<MarshalAs(UnmanagedType.LPWStr)> fn As String) As Integer
<PreserveSig()> _
Function put_FileName(<MarshalAs(UnmanagedType.LPWStr)> fn As String) As Integer
End Interface
解决方案:实际上已经有效了!我正在运行一个测试项目,并没有打扰渲染视频分支。我错误地认为VSFilter会显示文件名,就像它选择与视频同名的SRT一样。显然,当您通过界面设置文件名时,它不会。因此,我不应该在GraphEdit中检查我的图形中的过滤器属性页面,而应该只是渲染视频,我已经在视频窗口中看过字幕。