通过代码设置DirectShow VSFilter文件名

时间:2014-08-15 15:57:21

标签: vb.net directshow.net

我一直在寻找一种方法,使用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中检查我的图形中的过滤器属性页面,而应该只是渲染视频,我已经在视频窗口中看过字幕。

0 个答案:

没有答案