gpt4 book ai didi

c# - 添加声音过滤器并连接声音针脚

转载 作者:行者123 更新时间:2023-12-02 22:56:45 28 4
gpt4 key购买 nike

语境

具有用户控件的WPF UI,该控件可实例化多个COMS并在directshow.net中使用过滤器

问题

音频引脚的名称根据正在播放的视频而变化。 (都是.avi文件)
如您在屏幕截图中看到的,声音引脚不相同。 (一个是“Stream 01”,另一个是“01 Microsoft wave form .....”)

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

图表

用完全相同的代码生成图形,只更改视频文件。



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

相关代码

//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;
}

GetPin代码
    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;
}

最佳答案

您无需使用硬编码名称选择输出引脚。相反,实际上这是一种更可靠的方法,您需要枚举引脚(就像GetPin函数已经做的那样),然后枚举给定引脚上的媒体类型。可以仅查看第一种媒体类型(如果有)。如果其主要类型是MEDIATYPE_Audio,则不管您的有效名称如何,它都是您的密码。

关于c# - 添加声音过滤器并连接声音针脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369437/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com