【问题标题】:Controlling DirectVobSub filter programmatically以编程方式控制 DirectVobSub 过滤器
【发布时间】:2019-12-30 04:52:03
【问题描述】:

我有一个基于 DirectShow 的播放器,它使用 DirectVobSub 来显示字幕。

我希望有快捷方式来上下移动字幕同步。

这在 VobSub 对话中是可能的,但没有快捷方式。

我使用 Visual C++,我现在有指向 VobSub 过滤器的 IBaseFilter 指针,我想我必须以某种方式调用该接口。有什么想法吗?

【问题讨论】:

    标签: video visual-c++ directshow subtitle


    【解决方案1】:

    您应该能够使用来自IBaseFilter 的常规IUnknown::QueryInterface 获得IDirectVobSub 和类似的接口。

    要获得这些接口的定义,您通常需要首先检查用于构建过滤器的源(您是从某个地方获得的,对吧?)。虽然来自另一个 repo 的副本也应该可行。

    https://github.com/Fluffiest/mpc-hc/blob/cfd18b62248c0e97f5626d94539d60d5361cc5a1/src/filters/transform/VSFilter/IDirectVobSub.h#L30

        interface __declspec(uuid("EBE1FB08-3957-47ca-AF13-5827E5442E56"))
    IDirectVobSub :
        public IUnknown
        {
            STDMETHOD(get_FileName) (THIS_
                                     WCHAR* fn  // fn should point to a buffer allocated to at least the length of MAX_PATH (=260)
                                    ) PURE;
    
            STDMETHOD(put_FileName) (THIS_
                                     WCHAR* fn
                                    ) PURE;
    

    【讨论】:

    • 清晰简洁(而且工作也很好......),非常感谢!
    • 作为补充问题,如何创建新的 IDirectVobSub 对象?我的意思是,如果视频没有字幕,因此 DirectVobSub 没有加载,我想在视频中添加字幕文件,我该怎么做?到目前为止,我已经尝试过CoCreateInstance(__uuidof(IDirectVobSub), NULL, CLSCTX_INPROC_SERVER, __uuidof(IBaseFilter),(void**)&pFilter);,但出现“类未注册”错误
    • 第一个参数应该是这个 CLSID:{93A22E7A-5091-45ef-BA61-6DA26156A5D0}
    • 好的。现在一切都返回 S_OK,我打电话给 IGraphBuilder::AddFilterpFilter->QueryInterface,我什至列举了过滤器以确认它在那里(它是),但是......实际的过滤器没有显示。
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2017-12-11
    • 2016-05-05
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2023-04-03
    • 2017-06-26
    相关资源
    最近更新 更多