欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 16:15:57
直接上测试代码和运行结果 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#获取设备(Audio和Video)名称 简单整理

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

一、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设备名称完全对上。

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