标签: directshow

C#+ DirectShow.NET =简单的WebCam访问?

我找到了一个用C#访问网络摄像头的例子.该示例使用DirectShow.NET库.我试图理解代码,但到目前为止我唯一可以理解的是,usercontrol不知何故调用directshow直接绘制到用户控件的表面.

我想访问每个帧并将其放入Bitmap对象.如何判断新帧何时到达?如何将这个新帧捕获到位图对象中?

如果您了解DirectShow.NET的方法,这可能很容易回答.

c# webcam directshow directshow.net

6
推荐指数
1
解决办法
6万
查看次数

DirectShow/WinForms中的硬件加速视频

目前正在为需要播放高清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.

  • 我知道Windows 7支持H264.但是,它似乎不是DirectShow过滤器?
  • 为什么我的视频使用WPF加速,但在使用DirectShow时却没有?我的理解是DirectShow支持DXvA.

tldr:如何在WinForms中实现硬件加速的WMV和H264视频播放?

谢谢!

hardware directshow wmv h.264 winforms

6
推荐指数
1
解决办法
3842
查看次数

在顶部绘制带有文本的视频

我正在开发一个应用程序,我有一个问题,我似乎无法找到解决方案.该应用程序是用vc ++编写的.我需要做的是显示一个YUV视频源,其上面有文字.

现在,通过使用GDI和DirectDraw叠加层上的视频在OnPaint方法中绘制文本,它可以正常工作.我需要摆脱叠加层,因为它会导致许多问题.它不适用于某些视频卡,vista,7等.

我无法找到一种以更兼容的方式完成同样事情的方法.我可以使用带有后台缓冲区的DirectDraw绘制视频,并将其复制到主缓冲区就好了.这里的问题是,由于视频刷新的次数,在GDI中绘制的文本会闪烁.我真的希望保持代码尽可能完整地绘制文本,因为它运作良好.

有没有办法将文本直接绘制到DirectDraw缓冲区或内存缓冲区或其他东西,然后将其blt到后台缓冲区?我应该一起看另一种方法吗?两个重要的操作系统是XP和7.如果有任何想法让我知道,我会测试它们.谢谢.

windows-xp directshow gdi directdraw windows-7

6
推荐指数
1
解决办法
2357
查看次数

DirectShow中的实时视频编码

我开发了一个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

encoding directshow cuda real-time opencl

6
推荐指数
1
解决办法
1万
查看次数

在没有regsvr32的情况下从文件创建COM对象

是否可以仅使用dll而不使用regsvr32创建COM对象的实例?

我的主要目标是创建一个directshow过滤器的实例并将其插入到我的图形中 - 但我不想让regsvr32注册过滤器.过滤器将在一个dll/ax中,将与我的应用程序一起分发,并将出现在我的路径中.我也会知道CLSID.

所以我基本上只需要一个方法来创建一个类型的实例,同时只有dll/ax和CLSID.这可能在C#中吗?

c# com directshow

6
推荐指数
1
解决办法
2487
查看次数

关于在C#中设置FIle Writer的问题

我在C#中使用DirectShowLib.我想在C#中使用File Writer来设置文件输出.我想使用File Writer,因为Graph.SetOutputFileName()不会连接到我的编码器,但File Writer会.如何在C#中设置文件编写器保存的文件?

我尝试在DxPropPages示例中提取其属性页,但是不会出现File Writer.

c# directshow directshow.net

6
推荐指数
1
解决办法
2107
查看次数

虚拟网络摄像头输入为字节流

我没有网络摄像头.我想实现虚拟网络摄像头(或伪设备驱动程序),它可以作为普通网络摄像头(虚拟网络摄像头)工作,并将内存流或字节作为输入.我怎样才能发展这个?DirectShow可以对此有所帮助吗?我什么都不知道.请帮忙

我发现有很多软件将视频文件作为输入,但我希望将字节流作为输入.

c c# windows directshow

6
推荐指数
1
解决办法
2万
查看次数

构建Intel Media SDK Directshow示例:"无法打开包含文件:'streams.h':没有这样的文件或目录"

正如标题所说,我有这个错误.我已安装:

  • Visual Studio Professional 2010
  • Microsoft Windows SDK 7.0A(默认设置)
  • Microsoft Windows SDK 7.1
  • Microsoft Windows SDK 6.1(英特尔发行说明推荐)
  • DirectX SDK 2010年6月

必须有一些我缺少的SDK或库.会是什么呢?

顺便说一下,我也错过了一个名为"combase.h"的文件.大概相关.

谢谢!

sdk directshow visual-studio-2010

6
推荐指数
1
解决办法
8612
查看次数

使用DirectShow过滤器而不通过私有CoCreateInstance注册它

所以我基本上读到了这个,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)

c++ com encoding directshow mpeg-4

6
推荐指数
1
解决办法
5097
查看次数

如何消除DirectShow过滤链中的1秒延迟?(使用Delphi和DSPACK)

我有一个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)

delphi audio directshow dspack

5
推荐指数
1
解决办法
2514
查看次数