Tag: directshow

SampleGrabber参数不正确

我正试图在我的directshow应用程序中使用samplegrabber保存jpg文件。 图表运行正常但是当我启动CaptureImage()函数时,它获取到GetCurrentBuffer并返回“参数不正确”.. hr = -2147024809。 AMMediaType mediaType = new AMMediaType(); VideoInfoHeader videoInfo = new VideoInfoHeader(); (pSampleGrabber as ISampleGrabber).GetConnectedMediaType(mediaType); videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader)); int width = videoInfo.BmiHeader.Width; int height = videoInfo.BmiHeader.Height; int size = videoInfo.BmiHeader.ImageSize; DsUtils.FreeAMMediaType(mediaType); int hr = 0; int bufferSize = 0; hr = (pSampleGrabber as ISampleGrabber).GetCurrentBuffer(ref bufferSize, IntPtr.Zero); CheckHR(hr, “Could not get buffer […]

在C#中显示来自原始未压缩字节源的实时video:WPF与Win表单

我有一个实时的16位灰度video流,通过内存中的环形缓冲区作为原始的未压缩字节流(每像素2个字节,2 ^ 18像素/帧,32帧/秒)。 (这来自科学级相机,通过PCI帧抓取器)。 我想对video进行一些简单的处理(剪辑动态范围,着色,添加叠加),然后使用C#在窗口中显示它。 我使用Windows Forms和GDI工作(对于每个帧,构建一个Bitmap对象,根据我的后处理步骤写入原始的32位RGB像素值,然后使用Graphics类绘制帧)。 但是这使用了我想要用于其他事情的大量CPU。 所以我对使用WPF进行GPU加速video显示感兴趣。 (我也想开始使用WPF来实现其数据绑定和布局function。) 但我之前从未使用过WPF,所以我不确定如何处理这个问题。 我在网上发现的关于video和WPF的大多数内容涉及从磁盘(例如WMV)读取压缩video文件,或者使用Windows已经理解的驱动程序层从消费级相机获取流。 所以它似乎不适用于此(但如果我错了,请纠正我)。 所以,我的问题: 是否有基于WPF的直接方式从内存中的原始未压缩字节播放video(即使只是8位灰度或24位RGB)? 我是否需要构建DirectShowfilter(或其他DirectShow / Media Foundation-ish的东西)才能在GPU上进行后期处理? 此外,任何适合这些任务的文档,示例,博客等的一般建议/建议都将受到赞赏。 谢谢! 后续:经过一些实验,我发现WriteableBitmap足够快,满足我的需求,并且非常容易正确使用:只需调用WritePixels() ,任何绑定到它的Image控件都会自行更新。 具有内存映射部分的InteropBitmap明显更快,但我不得不将p / InteropBitmap写入kernel32.dll以在.NET 3.5上使用它。

某些配置的DirectShow虚拟摄像头不会出现在列表中

我使用DirectShowfilter作为虚拟相机(CLSID_VideoInputDeviceCategory)。 它运行良好,但有些应用程序/配置不会将此Feed显示为源。 例如,在win 8.1上,我可以通过webrtc在Chrome / Firefox中看到这个来源。 但是在胜利10中 – chrome没有在列表中显示此来源(但FF确实如此)。 adobe flash也没有在列表中显示它。 对我来说最重要的是在win 10 / chrome上提供它。 可能会对此产生什么影响以及如何解决? 更新 看起来x86和x64有两组不同的filter。 所以带铬的问题是由不同的建筑造成的。 但闪光灯仍未检测到相机。

Crossbarfilter将当前输入更改为Composite

我是DirectShow的新手。 我正在用C#编写一个应用程序来捕获模拟捕获卡。 我有一个模拟采集卡,我想知道如何更改模拟交叉开关滤波器属性,从“0:模拟调谐器输入”到“1:video复合输入”。 这是我的过滤图 我无法将Tuner的“模拟video引脚”连接到Crossbar滤波器的“Video Composite In”。 我尝试运行IAMCrossbarfilter的“Route”方法,但失败了。 我不知道我的道路是否正确。 请指导……

使用DirectShow.NET在C#中的IVideoWindow上显示半透明的Image对象

我一直在使用DirectShow.NET与C#中的网络摄像头连接,到目前为止一切都进展顺利。 但是,现在我正在尝试设置一种“裁剪”图像的方法(当它仍然显示为网络摄像头预览时)。 基本上,我试图在IVideoWindow对象的顶部显示某种大多数透明的图像。 然而,处理C#的透明度已经远远没有结束。 那么,我如何在IVideoWindow上层叠Image对象? 谢谢!

Directshow录制/预览问题

我有一个项目需要使用DirectShow从网络摄像头录制video,但我需要能够在预览继续运行时停止录制。 我正在使用WPFMediaKit http://wpfmediakit.codeplex.com/ 问题是,当我录制video时,暂停function还会暂停应用程序中的预览窗格 我是DirectShow的新手,有什么建议可以解决这个问题或解决方案 非常感谢你。 PS我使用C#和WPF

在IGraphBuilder.RenderFile中无法播放具有COMexception的MP3文件

我是新手直接展示开发。 我正在学习关于直接表演的事情。 我正在尝试编写播放一些音频文件的方法。 它适用于许多.mp3文件,但对于我的一些mp3文件,接口IGraphBuilder的方法RenderFile()抛出以下exception 发生COMException:“由于不支持相同的传输,引脚无法连接。” 我最好的猜测是我错过了一些编解码器来播放这些文件。 任何人都可以建议我做错了什么。 有没有办法选择可以播放这些文件的filter。 我可以用Windows Media Player播放这些文件,所以我相信我已经安装了编解码器。 任何帮助都将具有重要价值。 提前致谢。

DirectShow USB网络摄像头改变video源

嘿所有我想在我的网络摄像头上找到将我的video源更改为“复合”的设置。 似乎如果我拔下USB然后将其重新插入并启动代码,它就会出现一个空白屏幕。 但是,一旦我更改了video源(在另一个程序中),然后返回并再次运行我的代码,它就会显示出来。 所以我需要一些东西,允许我改变它,以便同样的事情发生,但在我自己的应用程序内,而无需启动另一个具有该function来设置网络摄像头的程序。 当我拔出USB线然后重新插入并运行源代码时,应用程序的图片框为黑色。 我用来改变video源的“其他程序”(似乎可以调出图像): 在我使用“其他程序”后,我回到源代码并运行它,这就是我得到的: 我从这里使用名为dot Net Webcam Library的C#代码:在此处输入链接描述 它似乎使用DirectShow从这里输入链接描述 我在源代码中注意到它列出了不同类型的video设置(在下面的AXExtend.cs中找到): public enum PhysicalConnectorType { Video_Tuner = 1, Video_Composite, Video_SVideo, Video_RGB, Video_YRYBY, Video_SerialDigital, Video_ParallelDigital, Video_SCSI, Video_AUX, Video_1394, Video_USB, Video_VideoDecoder, Video_VideoEncoder, Video_SCART, Video_Black, Audio_Tuner = 0x1000, Audio_Line, Audio_Mic, Audio_AESDigital, Audio_SPDIFDigital, Audio_SCSI, Audio_AUX, Audio_1394, Audio_USB, Audio_AudioDecoder, } 但我不确定如何在代码中调用它: Device selectedDevice = device as Device; imageCapture.Device […]

使用DirectShow获取MP4文件持续时间

我需要获取mp4文件的持续时间,最好是以秒为单位的两倍。 我正在使用DirectShow(参见下面的代码),但它一直在抛出一个特别无益的错误。 我想知道是否有人有一个简单的解决方案。 (说真的,谁知道获取这些信息会非常困难) public static void getDuration(string moviePath) { FilgraphManager m_objFilterGraph = null; m_objFilterGraph = new FilgraphManager(); m_objFilterGraph.RenderFile(moviePath); IMediaPosition m_objMediaPosition = null; m_objMediaPosition = m_objFilterGraph as IMediaPosition; Console.WriteLine(m_objMediaPosition.Duration); } 每当我运行此代码时,我都会收到错误:“来自HRESULT的exception:0x80040265” 我也试过使用这个: 得到video的长度,但它不起作用,因为我不认为它适用于MP4文件。 说真的,我觉得必须有一个更简单的方法来做到这一点。 注意:我宁愿避免使用类似ffmpeg的exe,然后解析输出以获取信息。

使用DirectShow从内存渲染

我是DirectShow的新手,我正在寻找一种方法来渲染已经使用DirectShow.NET加载到内存中的video。 我怎样才能做到这一点? 即使你给我一个亮点,我也要感恩。