C#获取设备(Audio和Video)名称 简单整理
程序员文章站
2022-07-09 20:09:22
直接上测试代码和运行结果 static void Main(string[] args) { #region 测试代码 List dataList; dataList = DirectXHelper.GetAudioDevicesList(); OutPutInfo("DirectX获... ......
直接上测试代码和运行结果
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来获取麦克风名称
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来获取
/// <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来获取。
/// <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来进行推流.
先简单对比一下各个方式的差异 .
第一种方式 并不是拿来就能使用的, 要改配置文件,还要设置调试异常,
具体解决方法可以参考:
我编译的时候遇到前面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设备名称完全对上。
这个使用的过程中遇到不少问题,准备完整记录一下。