我找到了一个用C#访问网络摄像头的例子.该示例使用DirectShow.NET库.我试图理解代码,但到目前为止我唯一可以理解的是,usercontrol不知何故调用directshow直接绘制到用户控件的表面.
我想访问每个帧并将其放入Bitmap对象.如何判断新帧何时到达?如何将这个新帧捕获到位图对象中?
如果您了解DirectShow.NET的方法,这可能很容易回答.
目前正在为需要播放高清WMV和H264视频的Windows .NET应用程序进行原型设计.我的测试文件是完整的1080p.
目标硬件具有弱Atom处理器但强大的NVidia 9400显卡.我知道图形是集成的,但我的理解是它们适合于视频播放.
在Windows 7上测试,如果我使用MediaElement控件在WPF中播放我的测试文件,我的CPU使用率为0.
但是,目标操作系统是Windows XP,我们可能没有.NET 3.0.因此,应用程序需要在WinForms中运行.由于各种原因,Windows Media Player ActiveX不是一个选项.所以我们正在研究DirectShow.
我使用DirectShow.NET组合了一个播放器,使用VMR9全屏播放视频.使用这种方法,我的WMV文件占用了20-30%的CPU.我不得不安装一个mp4 muxer/demuxer甚至可以播放H264文件,然后它们消耗了40-50%的CPU.
tldr:如何在WinForms中实现硬件加速的WMV和H264视频播放?
谢谢!
我正在开发一个应用程序,我有一个问题,我似乎无法找到解决方案.该应用程序是用vc ++编写的.我需要做的是显示一个YUV视频源,其上面有文字.
现在,通过使用GDI和DirectDraw叠加层上的视频在OnPaint方法中绘制文本,它可以正常工作.我需要摆脱叠加层,因为它会导致许多问题.它不适用于某些视频卡,vista,7等.
我无法找到一种以更兼容的方式完成同样事情的方法.我可以使用带有后台缓冲区的DirectDraw绘制视频,并将其复制到主缓冲区就好了.这里的问题是,由于视频刷新的次数,在GDI中绘制的文本会闪烁.我真的希望保持代码尽可能完整地绘制文本,因为它运作良好.
有没有办法将文本直接绘制到DirectDraw缓冲区或内存缓冲区或其他东西,然后将其blt到后台缓冲区?我应该一起看另一种方法吗?两个重要的操作系统是XP和7.如果有任何想法让我知道,我会测试它们.谢谢.
我开发了一个Windows应用程序,使用DirectShow从外部设备捕获视频.图像分辨率为640x480,无压缩保存的视频尺寸非常大(每秒约27MB).
我的目标是尽可能减小这个大小,所以我正在寻找一个允许我实时压缩视频的编码器.它可以是H.264,MPEG-2或其他任何东西.它必须允许我将视频保存到磁盘,最好是我也可以通过网络实时流式传输(Wi-Fi,所以大小应该是每秒1MB左右,或更少).重大的质量损失是不可接受的.
我发现为此任务获取适当的DirectShow过滤器非常困难.可以假设客户机是相当现代的(快速双核CPU)并且可以使用CUDA/OpenCL.有一些应用程序允许使用CUDA编码视频并提供良好的性能,但是我没有找到适当的DirectShow过滤器或可用于开发一个的API.NVIDIA nvcuvenc.dll似乎有私有API,因此我无法直接使用它.我找到的任何基于CPU的编码器对我的要求都太慢了,但也许我错过了一些.
任何人都可以向我推荐一个解决方案,即可以在闭源应用程序中使用的编码器(付费或免费),无论是使用CPU/CUDA/OpenCL还是DirectCompute,都可以获得良好的性能?或者我应该使用一些外部硬件视频编码器?
最好的祝福,
madbadger
是否可以仅使用dll而不使用regsvr32创建COM对象的实例?
我的主要目标是创建一个directshow过滤器的实例并将其插入到我的图形中 - 但我不想让regsvr32注册过滤器.过滤器将在一个dll/ax中,将与我的应用程序一起分发,并将出现在我的路径中.我也会知道CLSID.
所以我基本上只需要一个方法来创建一个类型的实例,同时只有dll/ax和CLSID.这可能在C#中吗?
我在C#中使用DirectShowLib.我想在C#中使用File Writer来设置文件输出.我想使用File Writer,因为Graph.SetOutputFileName()不会连接到我的编码器,但File Writer会.如何在C#中设置文件编写器保存的文件?
我尝试在DxPropPages示例中提取其属性页,但是不会出现File Writer.
我没有网络摄像头.我想实现虚拟网络摄像头(或伪设备驱动程序),它可以作为普通网络摄像头(虚拟网络摄像头)工作,并将内存流或字节作为输入.我怎样才能发展这个?DirectShow可以对此有所帮助吗?我什么都不知道.请帮忙
我发现有很多软件将视频文件作为输入,但我希望将字节流作为输入.
正如标题所说,我有这个错误.我已安装:
必须有一些我缺少的SDK或库.会是什么呢?
顺便说一下,我也错过了一个名为"combase.h"的文件.大概相关.
谢谢!
所以我基本上读到了这个,http: //www.gdcl.co.uk/2011/June/UnregisteredFilters.htm .
它告诉您如何使用过滤器而不注册它们.有两种方法,new和使用私有CoCreateInstance.我试图使用CoCreateInstance方法.
在该站点的示例中,代码列为,
IUnknownPtr pUnk;
HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk);
if (SUCCEEDED(hr))
{
IBaseFilterPtr pFilter = pUnk;
pGraph->AddFilter(pFilter, L"Private Filter");
pGraph->RenderFile(pMediaClip, NULL);
}
Run Code Online (Sandbox Code Playgroud)
我的代码如下,
IUnknownPtr pUnk;
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4demux.dll"), IID_BaseFilter, &pUnk);
if (SUCCEEDED(hr))
{
//add functionality
}
Run Code Online (Sandbox Code Playgroud)
我猜IID_BaseFilter是我应该使用的,它是我用于其他过滤器的东西.但我给出了错误'ClassFactory无法提供请求的类'.
我在这里错过了什么吗?任何帮助将不胜感激.提前致谢!
编辑:代码
IBaseFilter *pSrc = NULL, *pSrc2 = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
ICaptureGraphBuilder2 *pBuild;
IMediaControl *pControl = NULL;
// This example omits error handling.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, …Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 6 Pro应用程序,它使用DSPACK组件库从系统的首选音频输入设备向Skype发送音频.我正在使用TSampleGrabber组件进入Filter Graph链,然后将音频缓冲区发送到Skype.问题是我每秒只能听一次音频.换句话说,TSampleGrabber实例的OnBuffer()事件仅在Buffer参数中每秒触发一次具有完整秒数的数据.我需要知道如何修改我的Filter Graph链,以便以比每秒一次更快的间隔从输入设备抓取数据.如果可能的话,我想尽快每50毫秒或至少每100毫秒做一次.
My Filter Graph链由一个TFilter组成,该TFilter映射到顶部的系统首选音频输入设备.我将该滤波器的输出引脚连接到"WAV Dest"指定TFilter的输入引脚,这样我就可以获得PCM WAV格式的采样.然后,我将'WAV Dest'滤波器的输出引脚连接到TSampleGrabber实例的输入引脚.我需要更改什么才能使TSampleGrabber OnBuffer()事件以更快的间隔触发?
更新:根据Roman R的回答,我能够实现我在下面展示的解决方案.一个说明.他的链接引导我访问以下有助于解决方案的博文:
http://sid6581.wordpress.com/2006/10/09/minimizing-audio-capture-latency-in-directshow/
// Variable declaration for output pin to manipulate.
var
intfCapturePin: IPin;
...............
// Put this code after you have initialized your audio capture device
// TFilter instance *and* set it's wave audio format. My variable for
// this is FFiltAudCap. I believe you need to set the buffer size before
// connecting up the pins of the Filters. The media type was
// retrieved …Run Code Online (Sandbox Code Playgroud)