C# 使用DirectShow调用USB摄像头的完整demo | 您所在的位置:网站首页 › usb摄像头转网络摄像头盒子不亮 › C# 使用DirectShow调用USB摄像头的完整demo |
C# 使用DirectShow调用USB摄像头的完整demo
作者:音视频技术栏目:公开2023-06-07 11:012917
以下是一个使用C#和DirectShow调用USB摄像头的完整示例代码: using System; using System.Drawing; using System.Windows.Forms; using DirectShowLib; namespace DirectShowDemo { public partial class Form1 : Form { private IFilterGraph2 filterGraph = null; private ICaptureGraphBuilder2 captureGraphBuilder = null; private IBaseFilter videoSourceFilter = null; public Form1() { InitializeComponent(); InitializeVideo(); } private void InitializeVideo() { // 创建 Filter Graph Manager filterGraph = (IFilterGraph2)new FilterGraph(); // 创建 Capture Graph Builder captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); // 添加视频输入设备(USB摄像头) Guid category = PinCategory.Capture; Guid mediaType = MediaType.Video; string deviceName = null; // 默认设备 var devices = DsDevice.GetDevicesOfCat(category); if (devices.Length > 0) deviceName = devices[0].Name; int hr = captureGraphBuilder.SetFiltergraph(filterGraph); if (hr < 0) throw new Exception("Failed to set filter graph"); hr = filterGraph.AddSourceFilterForMoniker( new Moniker(deviceName), null, "Video Source", out videoSourceFilter); if (hr < 0) throw new Exception("Failed to add source filter"); // 创建 Sample Grabber 滤镜,用于获取视频帧数据 ISampleGrabber sampleGrabber = (ISampleGrabber)new SampleGrabber(); hr = filterGraph.AddFilter((IBaseFilter)sampleGrabber, "Sample Grabber"); if (hr < 0) throw new Exception("Failed to add Sample Grabber filter"); // 配置 Sample Grabber 滤镜 AMMediaType mediaTypeOut = new AMMediaType(); mediaTypeOut.majorType = MediaType.Video; mediaTypeOut.subType = MediaSubType.RGB24; hr = sampleGrabber.SetMediaType(mediaTypeOut); if (hr < 0) throw new Exception("Failed to set Sample Grabber media type"); // 连接 Filter Graph 中的滤镜节点 hr = captureGraphBuilder.RenderStream( PinCategory.Capture, MediaType.Video, videoSourceFilter, null, // 使用默认编解码器 (IBaseFilter)sampleGrabber); if (hr < 0) throw new Exception("Failed to render stream"); // 开始捕获视频流 IMediaControl mediaControl = (IMediaControl)filterGraph; hr = mediaControl.Run(); if (hr < 0) throw new Exception("Failed to run video capture"); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // 停止捕获视频流,并释放资源 IMediaControl mediaControl = (IMediaControl)filterGraph; int hr = mediaControl.Stop(); if (hr >= 0 && videoSourceFilter != null) Marshal.ReleaseComObject(videoSourceFilter); if (captureGraphBuilder != null) Marshal.ReleaseComObject(captureGraphBuilder); if (filterGraph != null) Marshal.ReleaseComObject(filterGraph); } } }这个示例中使用了DirectShowLib库来方便地调用DirectShow。在初始化视频时,首先创建 Filter Graph Manager 和 Capture Graph Builder。然后通过添加视频输入设备(USB摄像头)来获取视频源滤镜对象。接着,使用 Sample Grabber 滤镜来捕获视频帧数据并将其渲染到屏幕上。 在关闭应用程序时,需要停止捕获视频流,并释放所有资源。 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。 转载请注明出处:https://avmedia.0voice.com/?id=42994 打赏 0赞 觉得有用就打赏一下吧 微信扫一扫打赏 支付宝扫一扫打赏 × 音视频技术 管理员 分享: 扫描分享到社交APP 上一篇 C# 调用USB摄像头录像 下一篇 输入为input_size, output_size的多源域注意力自适应代码 相关推荐 [05/31/2024-09:26:07] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +598, GPU +180, now: CPU 27175, GPU 1586 (MiB) [05/31/202...这段日志是关于TensorRT的运行错误,显示了一些错误信息和异常。根据日志中的信息,可以看到以下几个问题:[MemUsageChange]表示在初始化cuDNN时出现了内存使用情况变化。Localtimingcachei... 音视频技术 2024-06-01 16 0 0 c++ 代码中 如何使用cmake 添加一个宏给 代码中使用要在C++代码中使用CMake添加宏,可以按照以下步骤进行操作:在CMakeLists.txt文件中添加以下代码来定义宏:add_definitions(-DYOUR_MACRO_NAME)在你的C++代码中,可以通过#ifd... 音视频技术 2024-06-01 14 0 0 windows HWAVEIN 头文件在Windows平台上使用HWAVEIN头文件时,需要包含头文件。是Windows多媒体API的一部分,提供了访问音频设备和功能的函数和结构。下面是一个示例代码片段,演示如何包含并使用HWAVEIN相关函数:... 音视频技术 2024-06-01 16 0 0 windows 打印音频设备在Windows平台上,可以使用WindowsMultimediaAPI来获取和打印音频设备信息。以下是一个示例代码:#include#include#... 音视频技术 2024-06-01 14 0 0 windows waveInOpen 打开指定名称的麦克风在Windows平台上,可以使用waveInOpen函数打开指定名称的麦克风进行音频采集。下面是一个简单的示例代码:#include#includev... 音视频技术 2024-06-01 16 0 0 x, y = get_sine_wave(freq, T, A, phase) File "E:\python\pytorch\拟合正弦波\pythonProject1\示例1\demo.py", line 15, in get_sine_wave..."> x, y = get_sine_wave(freq, T, A, phase) File "E:\python\pytorch\拟合正弦波\pythonProject1\示例1\demo.py", line 15, in get_sine_wave..." /> x, y = get_sine_wave(freq, T, A, phase) File "E:\python\pytorch\拟合正弦波\pythonProject1\示例1\demo.py", line 15, in get_sine_wave...">Traceback (most recent call last): File "E:\python\pytorch\拟合正弦波\pythonProject1\示例1\demo.py", line 25, in x, y = get_sine_wave(freq, T, A, phase) File "E:\python\pytorch\拟合正弦波\pythonProject1\示例1\demo.py", line 15, in get_sine_wave...这个错误是由于linspace函数的第三个参数需要是整数类型,而你传递了一个浮点数T*freq。你可以将其转换为整数来修复这个问题。修改代码如下:x=np.linspace(0,int(T*freq),int(T... 音视频技术 2024-06-01 14 0 0 实现一下错误处理当waveInGetDevCaps函数返回错误时,你可以通过调用waveInGetErrorText函数获取错误信息,并进行适当的处理。以下是更新后的代码示例:#include#include... 音视频技术 2024-06-01 16 0 0 windows WAVEFORMATEX 含义WAVEFORMATEX是Windows平台上用于描述音频格式的结构体。它定义了音频数据的采样率、位深度、声道数等属性。WAVEFORMATEX结构体的定义如下:typedefstruct{WORDwForma... 音视频技术 2024-06-01 14 0 0 void DebugNodave::RegisterStart() { auto handle_debug_nodave = [this](const HttpRequest &request) -> HttpResponse { HttpResponse response(HttpStatusCode::Ok); // 假设HttpRequest类有一个方法GetBody,用于获取请求体的内容 std::string re...这段代码存在以下几个问题:缺少头文件引用:该代码中使用了HttpRequest、HttpResponse、HttpStatusCode等类,但没有看到对应的头文件引用。异常处理不完整:在打开socket连接失败或者初始化适配器失... 音视频技术 2024-06-01 16 0 0 #include #include #include int main() { UINT deviceCount = waveInGetNumDevs(); std::cout你的代码看起来是用于获取并打印音频输入设备信息。在这段代码中,WAVEINCAPS结构体是用来存储设备的能力和属性。然而,需要注意的是WAVEINCAPS结构体中并没有名为szProductDesc的字段。正确的字段名称应该是... 音视频技术 2024-06-01 14 0 0 发表列表 评论列表还没有评论,快来说点什么吧~ |
CopyRight 2018-2019 实验室设备网 版权所有 |