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

您所在的位置:网站首页 查看摄像头是否支持扬声器 C#获取设备(Audio和Video)名称 简单整理

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

2024-06-29 13:51| 来源: 网络整理| 查看: 265

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

static void Main(string[] args) { #region 测试代码 List 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 data) { Console.WriteLine(defaultMessage); if (data == null) { return; } foreach (var item in data) { Console.WriteLine(item); } Console.WriteLine(); }运行结果:

 

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

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

public static List GetAudioDevicesList() { var audioDevices = new CaptureDevicesCollection(); var deviceNames = new List(); 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来获取

/// /// 获取声音输入设备 /// /// public static List GetInDeviceList() { var devices = new List(); int waveInDevices = WaveIn.DeviceCount; for (int i = 0; i < waveInDevices; i++) { devices.Add(WaveIn.GetCapabilities(i)); } return devices.Select(item => item.ProductName).ToList(); } /// /// 获取声音输入设备完整名称 /// /// public static List GetInDeviceListFull() { List devices = new List(); 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来获取。

/// /// 获取麦克风列表 /// /// public static List GetAudioInDevicesList() { List devicesList = new List(); 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; } /// /// 获取摄像头列表 /// /// public static List GetVideoInDevicesList() { List devicesList = new List(); 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设备名称完全对上。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3