C# 添加声音过滤器并连接声音插脚 上下文

C# 添加声音过滤器并连接声音插脚 上下文,c#,audio,directshow,avi,directshow.net,C#,Audio,Directshow,Avi,Directshow.net,带有用户控件的WPF UI,该控件实例化多个COM并使用directshow.net的筛选器 问题 音频插脚的名称根据播放的视频而变化。(两者都是.avi文件) 正如您在屏幕截图中看到的,声音引脚不一样。(一个是“Stream 01”,另一个是“01 Microsoft波形…”) 在我的代码中,我使用ConnectDirect和GetPin方法。要使用GetPin,您需要提供一个pin名称 图 图形生成与代码完全相同,仅更改视频文件 问题: 当管脚名称根据正在运行的.avi文件而变化时,如何连

带有用户控件的WPF UI,该控件实例化多个COM并使用directshow.net的筛选器

问题 音频插脚的名称根据播放的视频而变化。(两者都是.avi文件) 正如您在屏幕截图中看到的,声音引脚不一样。(一个是“Stream 01”,另一个是“01 Microsoft波形…”)

在我的代码中,我使用ConnectDirect和GetPin方法。要使用GetPin,您需要提供一个pin名称

图 图形生成与代码完全相同,仅更改视频文件

问题: 当管脚名称根据正在运行的.avi文件而变化时,如何连接过滤器?顺便说一句,一个avi文件是“自制”的,而另一个是microsoft avi示例文件(12秒蓝色时钟)

相关代码 获取PIN码
您不需要使用硬编码名称选择输出管脚。相反,这是一种更可靠的方法,事实上,您需要枚举管脚-就像您的
GetPin
函数已经做的那样-然后枚举给定管脚上的媒体类型。只查看第一种媒体类型(如果有)是可以的。如果它的主要类型是
MEDIATYPE\u Audio
,那么不管它的有效名称如何,它都是你的pin码。

Dude。你是指挥秀巴别塔的大师和先知。你得到了加拿大QC Saguenay的尊敬。
//sound filter linker
IBaseFilter pACMWrapper = (IBaseFilter)new ACMWrapper();
hr = m_FilterGraph.AddFilter(pACMWrapper, "ACM wrapper");


//add le default direct sound device

IBaseFilter pDefaultDirectSoundDevice = null;

try
{
    pDefaultDirectSoundDevice = (IBaseFilter)new DSoundRender();
    hr = m_FilterGraph.AddFilter(pDefaultDirectSoundDevice, "Default DirectSound Device");


    IBaseFilter aviSplitter;
    //find the avi splitter automatically added when I connect samp grabber to source filter.
    m_FilterGraph.FindFilterByName("AVI Splitter", out aviSplitter);

    System.Windows.MessageBox.Show(""); // graph screenshot is from here.

    hr = m_FilterGraph.Connect(GetPin(aviSplitter, "Stream 01"), GetPin(pACMWrapper, "Input"));
    DsError.ThrowExceptionForHR(hr);

    //connect audio filters 
    hr = m_FilterGraph.ConnectDirect(GetPin(pACMWrapper, "Output"), GetPin(pDefaultDirectSoundDevice, "Audio Input pin (rendered)"), null);
    DsError.ThrowExceptionForHR(hr);
}
catch (Exception)
{
    pDefaultDirectSoundDevice = null;
    //log error, play video without sound
    //throw;
}
    private IPin GetPin(IBaseFilter destinationFilter, string pinName)
    {
        IEnumPins pinEnum;
        int hr = destinationFilter.EnumPins(out pinEnum);
        DsError.ThrowExceptionForHR(hr);

        IPin[] pins = new IPin[1];

        IntPtr fetched = Marshal.AllocCoTaskMem(4);

        while (pinEnum.Next(1, pins, fetched) == 0)
        {
            PinInfo pInfo;
            pins[0].QueryPinInfo(out pInfo);

            bool found = (pInfo.name == pinName);
            DsUtils.FreePinInfo(pInfo);
            if (found)
                return pins[0];
        }
        return null;
    }