直接上測試代碼和運(yùn)行結(jié)果 static void Main(string[] args) { #region 測試代碼 List<string> dataList; dataList = DirectXHelper.GetAudioDevicesList(); OutPutInfo("DirectX獲取麥克風(fēng):", dataList); dataList = NAudioHelper.GetInDeviceList(); OutPutInfo("NAudio獲取麥克風(fēng)", dataList); dataList = NAudioHelper.GetInDeviceListFull(); OutPutInfo("NAudio獲取麥克風(fēng)完整名稱", dataList); dataList = NAudioHelper.GetOutDeviceList(); OutPutInfo("NAudio獲取揚(yáng)聲器", dataList); dataList = NAudioHelper.GetOutDeviceListFull(); OutPutInfo("NAudio獲取揚(yáng)聲器完整名稱", dataList); dataList = AForgeHelper.GetAudioInDevicesList(); OutPutInfo("AForge獲取麥克風(fēng)", dataList); dataList = AForgeHelper.GetVideoInDevicesList(); OutPutInfo("AForge獲取攝像頭", dataList); //dataList = DeviceHelper.GetAudioInList(); //OutPutInfo("VC++獲取麥克風(fēng)(中文會(huì)亂碼):", dataList); dataList = DeviceHelper.GetAudioInDeviceList(); OutPutInfo("VC++獲取麥克風(fēng):", 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(); }運(yùn)行結(jié)果: 主要使用了四種方式來獲取: 一、C#直接調(diào)用DirectX來獲取麥克風(fēng)名稱 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> /// 獲取聲音輸入設(shè)備 /// </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> /// 獲取聲音輸入設(shè)備完整名稱 /// </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> /// 獲取麥克風(fēng)列表 /// </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++一個(gè)開源項(xiàng)目EnumDevice
本文獲取獲取設(shè)備信息,主要是為了使用FFMpeg的API來進(jìn)行推流. 先簡單對(duì)比一下各個(gè)方式的差異 . 第一種方式 并不是拿來就能使用的, 要改配置文件,還要設(shè)置調(diào)試異常, 具體解決方法可以參考:https://www.cnblogs.com/wzwyc/articles/7262666.html 我編譯的時(shí)候遇到前面2個(gè)問題,改后能正常獲取。 第二種方式 NAudio (C#開源項(xiàng)目)在處理聲音方便很出名。 結(jié)合推流項(xiàng)目它不怎么合適,原因有兩, 1、只能獲取音頻輸入設(shè)備即(麥克風(fēng))。獲取不到攝像頭 2、NAudio獲取麥克風(fēng)的名稱 無法和FFMpeg獲取名稱完成對(duì)上,有些電腦FFmpeg要全名,而有些不是. 第三種方式 AForge AForge在處理圖像方面更出名了,現(xiàn)在變?yōu)锳ccord.Net,這里只測試AForge為例。 因?yàn)楣δ軓?qiáng)大需要使用 AForge.Video.DirectShow.dll,AForge.Video.dll,AForge.dll, 不過 我僅僅是為了獲取一個(gè)麥克風(fēng)和攝像頭名稱,就要引用3個(gè)dll,100K左右,殺雞焉用牛刀,因此不符合我的要求。 第四種方式: EnumDevice.dll 網(wǎng)上VC++的一個(gè)開源想項(xiàng)目,編譯后8k,更重要的是和FFMpeg設(shè)備名稱完全對(duì)上。 這個(gè)使用的過程中遇到不少問題,準(zhǔn)備完整記錄一下。 |
|