本文介绍了如何混合aforge和DirectShow的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,在我遇到视频之前,我从未在C#中挣扎过。这似乎是一个接一个的试验。



捕获使用交叉开关8820设备

相机产生PAL视频

更糟糕但视频是交错的

需要一次从视频中抓取一帧。





所以在Aforge,除了隔行扫描,我可以得到我需要的一切,让它全部运行起来。我已经注册了DeInterlace.ax,它可以在directshow中工作,但我不知道如何混合这两个世界。

 VideoCaptureDeviceForm form =  new  VideoCaptureDeviceForm(); 

if (form.ShowDialog( this )== DialogResult.OK)
{
// 创建视频源
VideoCaptureDevice videoSource = form .VideoDevice;

// 打开它
OpenVideoSource(videoSource);
}
私有 void videoSourcePlayer_NewFrame( object sender, ref 位图img)
{





这是过度简化的课程。现在说我想添加去隔行滤波器?看来我不能在Aforge.Video世界中做到这一点?似乎迫使我直截了当?我必须在哪里打斗横杆,以及一系列有趣的东西



< pre lang =c#> 
void buildUSB2820()
{
InitilizeDirectShow();
IBaseFilter usb2820 = DirectShowLib.Utils.FilterGraphTools.AddFilterByName(graphBuilder,FilterCategory.VideoInputDevice,USB 2820 Device);
IBaseFilter crossbar = DirectShowLib.Utils.FilterGraphTools.AddFilterByName(graphBuilder,FilterCategory.AMKSCrossbar,WDM 2820 Crossbar);
bool success = DirectShowLib.Utils.FilterGraphTools.RenderPin(graphBuilder,crossbar,0:Video Decoder Out);
FinishGraph(参考usb2820,捕获);
}

private void InitilizeDirectShow()
{
cleanupCom();
int hr = 0;
graphBuilder =(IGraphBuilder)(new FilterGraph());
captureGraphBuilder =(ICaptureGraphBuilder2)(new CaptureGraphBuilder2());
hr = captureGraphBuilder.SetFiltergraph(graphBuilder);
DsError.ThrowExceptionForHR(hr);
mediaControl =(IMediaControl)graphBuilder;
videoWindow =(IVideoWindow)graphBuilder;
mediaEventEx =(IMediaEventEx)graphBuilder;
//向控制窗口发送通知消息
// hr = mediaEventEx.SetNotifyWindow(this.Handle,0x00008001,IntPtr.Zero);
//DsError.ThrowExceptionForHR(hr);
}

void FinishGraph(ref IBaseFilter filterName,string pinName)
{
IBaseFilter pAVIDecompressor = null;
if(deInterlace.Checked)
{
IBaseFilter lace = addIbaseFilter(CLSID_delace,lace);
connectPins(filterName,pinName,lace,Input);
pAVIDecompressor = addIbaseFilter(AVIDecoder,(IBaseFilter)new AVIDec());
connectPins(lace,Output,pAVIDecompressor,XForm In);
}
else
{
pAVIDecompressor = addIbaseFilter(AVIDecoder,(IBaseFilter)new AVIDec());
connectPins(filterName,pinName,pAVIDecompressor,XForm In);
}

// IBaseFilter render = addIbaseFilter(CLSID_VideoRenderer,Renderer);
// connectPins(color,XForm Out,render,VMR Input0);

IBaseFilter render = addIbaseFilter(CLSID_VideoRenderer,Renderer);
connectPins(pAVIDecompressor,XForm Out,render,VMR Input0);

//尝试添加到面板视频
connectRenderToForm(render);

mediaControl.Run();
}





所以我似乎陷入了这个或那个世界。在Aforge中,我没有办法在我知道的地方添加交错过滤器。在directShow中,我可以很容易地添加deinterlace,但是我很难抓住一个帧。我接近添加了sampleGrabber,但是在尝试将SampleGrabber连接到渲染器时出现了不兼容的引脚错误。



在一个简单的世界中,我会将directshow连接到Aforge VideoSourcePlayer对象,我会非常高兴。有什么想法?

解决方案


这篇关于如何混合aforge和DirectShow的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 02:24