C#获取设备(Audio和Video)名称 简单整理

直接上测试代码和运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
static void Main(string[] args)
       {
           #region 测试代码
           List<string> dataList;
 
           dataList = DirectXHelper.GetAudioDevicesList();
           OutPutInfo("DirectX获取麦克风:", dataList);
 
           dataList = NAudioHelper.GetInDeviceList();
           OutPutInfo("NAudio获取麦克风", dataList);
 
           dataList = NAudioHelper.GetInDeviceListFull();
           OutPutInfo("NAudio获取麦克风完整名称", dataList);
 
           dataList = NAudioHelper.GetOutDeviceList();
           OutPutInfo("NAudio获取扬声器", dataList);
 
           dataList = NAudioHelper.GetOutDeviceListFull();
           OutPutInfo("NAudio获取扬声器完整名称", dataList);
 
           dataList = AForgeHelper.GetAudioInDevicesList();
           OutPutInfo("AForge获取麦克风", dataList);
 
           dataList = AForgeHelper.GetVideoInDevicesList();
           OutPutInfo("AForge获取摄像头", dataList);
 
           //dataList = DeviceHelper.GetAudioInList();
           //OutPutInfo("VC++获取麦克风(中文会乱码):", dataList);
 
           dataList = DeviceHelper.GetAudioInDeviceList();
           OutPutInfo("VC++获取麦克风:", dataList);
 
           dataList = DeviceHelper.GetVideoInDeviceList();
           OutPutInfo("VC++获取摄像头:", dataList);
           #endregion
 
           Console.Read();
       }
 
       private static void OutPutInfo(string defaultMessage, IEnumerable<string> data)
       {
           Console.WriteLine(defaultMessage);
           if (data == null)
           {
               return;
           }
           foreach (var item in data)
           {
               Console.WriteLine(item);
           }
           Console.WriteLine();
       }

运行结果:

 

主要使用了四种方式来获取:

一、C#直接调用DirectX来获取麦克风名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static List<string> GetAudioDevicesList()
       {
           var audioDevices = new CaptureDevicesCollection();
           var deviceNames = new List<string>();
           for (int i = 0; i < audioDevices.Count; i++)
           {
               var guid = (audioDevices[i]).DriverGuid;
               if (guid == Guid.Empty)
               {
                   continue;
               }
               deviceNames.Add(audioDevices[i].Description);
           }
           return deviceNames;
       }

二、使用NAudio来获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/// <summary>
       /// 获取声音输入设备
       /// </summary>
       /// <returns></returns>
       public static List<string> GetInDeviceList()
       {
           var devices = new List<WaveInCapabilities>();
           int waveInDevices = WaveIn.DeviceCount;
           for (int i = 0; i < waveInDevices; i++)
           {
               devices.Add(WaveIn.GetCapabilities(i));
           }
           return devices.Select(item => item.ProductName).ToList();
       }
       /// <summary>
       /// 获取声音输入设备完整名称
       /// </summary>
       /// <returns></returns>
       public static List<string> GetInDeviceListFull()
       {
           List<string> devices = new List<string>();
           var enumberator = new MMDeviceEnumerator();
           var deviceCollection = enumberator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.All);
           for (int waveInDevice = 0; waveInDevice < WaveIn.DeviceCount; waveInDevice++)
           {
               WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
               foreach (MMDevice device in deviceCollection)
               {
                   try
                   {
                       if (device.FriendlyName.StartsWith(deviceInfo.ProductName))
                       {
                           devices.Add(device.FriendlyName);
                           break;
                       }
                   }
                   catch (Exception ex)
                   {
                       continue;
                   }
               }
           }
           return devices;
       }

三、使用AForge的API来获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// <summary>
/// 获取麦克风列表
/// </summary>
/// <returns></returns>
public static List<string> GetAudioInDevicesList()
{
    List<string> devicesList = new List<string>();
    try
    {
        var videoDevices = new FilterInfoCollection(FilterCategory.AudioInputDevice);
        foreach (FilterInfo device in videoDevices)
        {
            devicesList.Add(device.Name);
        }
    }
    catch (ApplicationException)
    {
        Console.WriteLine("No local capture devices");
    }
    return devicesList;
}
/// <summary>
/// 获取摄像头列表
/// </summary>
/// <returns></returns>
public static List<string> GetVideoInDevicesList()
{
    List<string> devicesList = new List<string>();
    try
    {
        var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        foreach (FilterInfo device in videoDevices)
        {
            devicesList.Add(device.Name);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return devicesList;
}

四、用VC++一个开源项目EnumDevice

 

本文获取获取设备信息,主要是为了使用FFMpeg的API来进行推流.

先简单对比一下各个方式的差异 .

第一种方式 并不是拿来就能使用的, 要改配置文件,还要设置调试异常,

具体解决方法可以参考:https://www.cnblogs.com/wzwyc/articles/7262666.html

我编译的时候遇到前面2个问题,改后能正常获取。

第二种方式 NAudio (C#开源项目)在处理声音方便很出名。

  结合推流项目它不怎么合适,原因有两, 

  1、只能获取音频输入设备即(麦克风)。获取不到摄像头

  2、NAudio获取麦克风的名称 无法和FFMpeg获取名称完成对上,有些电脑FFmpeg要全名,而有些不是.

第三种方式 AForge

AForge在处理图像方面更出名了,现在变为Accord.Net,这里只测试AForge为例。

因为功能强大需要使用 AForge.Video.DirectShow.dll,AForge.Video.dll,AForge.dll,

不过 我仅仅是为了获取一个麦克风和摄像头名称,就要引用3个dll,100K左右,杀鸡焉用牛刀,因此不符合我的要求。

第四种方式: EnumDevice.dll

    网上VC++的一个开源想项目,编译后8k,更重要的是和FFMpeg设备名称完全对上。

这个使用的过程中遇到不少问题,准备完整记录一下。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: artrdmpacket c是一个用于处理艺术家数据包的软件工具。 首先,artrdmpacket c是一个能够解析和处理艺术家数据包的功能强大的工具。一个艺术家数据包通常包含了艺术作品的各种信息,例如艺术家的姓名、作品的标题、创作日期、描述、尺寸、材料等等。artrdmpacket c能够将这些信息解析并存储在相应的变量中,使得用户可以方便地访问和操作这些数据。 其次,artrdmpacket c还可以将艺术家数据包转换为其他格式,以满足用户的需求。例如,用户可以将数据包转换为XML或JSON格式,以便于在不同的平台和系统上进行使用。这种转换过程是快速的,并且不会丢失任何数据。 另外,artrdmpacket c还提供了一些额外的功能,以增强用户的体验。例如,用户可以对数据包进行搜索和过滤,从而更方便地找到他们感兴趣的艺术作品。此外,用户还可以导入和导出数据包,以便于与其他用户分享和交流。 总的来说,artrdmpacket c是一个功能强大且易于使用的工具,用于处理艺术家数据包。它能够解析和存储艺术作品的各种信息,并提供了转换、搜索、过滤等额外的功能,以满足用户的需求。无论是专业艺术家还是艺术爱好者,都可以通过使用artrdmpacket c来更好地管理和使用艺术家数据包。 ### 回答2: artrdmpacket c是一种用于网络通信的协议。ARTRDM(可靠数据报托管传输)是一种可靠数据传输协议,用于在网络中的不可靠环境下进行数据传输。它提供了将数据分成小的数据包并在接收端重组的功能。 ARTRDMPacket C是ARTRDM协议的一个实现,它使用C编程语言来实现这个协议。使用C编程语言的一个优点是它的速度和效率,C编程语言被广泛应用于许多系统级编程任务。 ARTRDMPacket C提供了许多功能,包括数据包的分割和重组、数据包的可靠传输、数据的错误检测和纠正等。它还具有一些高级功能,如流量控制和拥塞控制,以确保数据的可靠性和高效性。 使用ARTRDMPacket C需要开发人员具备一定的网络编程知识和C编程能力。开发人员需要了解ARTRDM协议的工作原理和使用方法,并按照规定的接口和函数来实现相应的功能。 总的来说,ARTRDMPacket C是基于C编程语言实现的一个可靠数据传输协议,它提供了数据包分割和重组、可靠传输、错误检测和纠正等功能。它可以在网络通信中保证数据的可靠性和高效性。 ### 回答3: artrdmpacket c 是一种用于传输音频和视频数据的协议。ARTRDMPacket是Audio/Video Real-Time Data Multiplex Packet的简写,即音频/视频实时数据多路复用包。它是一种基于IP网络的协议,被广泛应用于音视频传输领域。 ARTRDMPacket c的主要特点是实时性和可靠性。它能够在实时的情况下传输音频和视频数据,并且能够保证数据的可靠传输。这对于音视频应用来说非常重要,因为任何延迟或数据丢失都会影响到使用者的听觉和视觉体验。 ARTRDMPacket c采用了多路复用的技术,可以同时传输多个音频和视频流。这意味着可以在同一协议中传输不同的音频和视频数据,避免了使用多个协议的复杂性。 ARTRDMPacket c还支持对数据进行编码和解码。音频和视频数据需要进行编码才能传输,而在接收端需要进行解码才能正常播放。ARTRDMPacket c可以对不同的编码格式进行支持,使得不同的音视频设备之间可以进行兼容和互操作。 总之,ARTRDMPacket c是一种用于音频和视频传输的实时数据多路复用协议。它具有实时性和可靠性的特点,并且支持对音频和视频数据的编码和解码。在音视频传输领域得到了广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值