乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C#獲取設(shè)備(Audio和Video)名稱 簡單整理

       小世界的野孩子 2021-04-05

      直接上測試代碼和運(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)備完整記錄一下。

      
                                          

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多