C# 使用DirectShow调用USB摄像头的完整demo 您所在的位置:网站首页 usb摄像头转网络摄像头盒子不亮 C# 使用DirectShow调用USB摄像头的完整demo

C# 使用DirectShow调用USB摄像头的完整demo

2024-06-02 07:04| 来源: 网络整理| 查看: 265

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... [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 添加一个宏给 代码中使用

要在C++代码中使用CMake添加宏,可以按照以下步骤进行操作:在CMakeLists.txt文件中添加以下代码来定义宏:add_definitions(-DYOUR_MACRO_NAME)在你的C++代码中,可以通过#ifd...

音视频技术 音视频技术 2024-06-01 14 0 0 windows HWAVEIN 头文件 windows HWAVEIN 头文件

在Windows平台上使用HWAVEIN头文件时,需要包含头文件。是Windows多媒体API的一部分,提供了访问音频设备和功能的函数和结构。下面是一个示例代码片段,演示如何包含并使用HWAVEIN相关函数:...

音视频技术 音视频技术 2024-06-01 16 0 0 windows 打印音频设备 windows 打印音频设备

在Windows平台上,可以使用WindowsMultimediaAPI来获取和打印音频设备信息。以下是一个示例代码:#include#include#...

音视频技术 音视频技术 2024-06-01 14 0 0 windows waveInOpen 打开指定名称的麦克风 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..."> Traceback (most recent call last):
 File 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 含义 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... 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 #include #include #include int main() { UINT deviceCount = waveInGetNumDevs(); std::cout

你的代码看起来是用于获取并打印音频输入设备信息。在这段代码中,WAVEINCAPS结构体是用来存储设备的能力和属性。然而,需要注意的是WAVEINCAPS结构体中并没有名为szProductDesc的字段。正确的字段名称应该是...

音视频技术 音视频技术 2024-06-01 14 0 0 发表列表 评论列表

还没有评论,快来说点什么吧~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有