C#硬件访问(摄像头、麦克风)

#需要引用:AForge类库、Microsoft.DirectX

C#硬件访问(摄像头、麦克风)_第1张图片
C#硬件访问(摄像头、麦克风)_第2张图片
C#硬件访问(摄像头、麦克风)_第3张图片

using System;
using System.Windows.Forms;
namespace CameraTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button5_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.Text = "拍照";
            form.Show();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form3 form = new Form3();
            form.Text = "声音";
            form.Show();
        }
    }
}

using AForge.Video.DirectShow;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace CameraTest
{
    public partial class Form2 : Form
    {
        private FilterInfoCollection videoDevices;
        public Form2()
        {
            InitializeComponent();
        }
         private void videoSourcePlayer()
        {
            VideoCaptureDevice videoCapture = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
#pragma warning disable CS0612 // 类型或成员已过时
            videoCapture.DesiredFrameSize = new Size(320, 240);
#pragma warning restore CS0612 // 类型或成员已过时
#pragma warning disable CS0612 // 类型或成员已过时
            videoCapture.DesiredFrameRate = 1;
#pragma warning restore CS0612 // 类型或成员已过时
            videoPlayer1.VideoSource = videoCapture;
            videoPlayer1.Start();
        }
        private void button4_Click_1(object sender, EventArgs e)
        {
            try
            {
                //枚举视频输入设备
                videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                if (videoDevices.Count == 0)
                {
                    throw new ApplicationException();
                }
                foreach (FilterInfo device in videoDevices)
                {
                    comboBox1.Items.Add(device.Name);
                }
                comboBox1.SelectedIndex = 0;
            }
            catch
            {
                comboBox1.Items.Add("没有视频设备!");
                videoDevices = null;
            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            videoSourcePlayer();
        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            //拍照

            if (videoPlayer1 == null)
                return;
            Bitmap bitmap = videoPlayer1.GetCurrentVideoFrame();
            saveFileDialog1.Filter = "Jpg 图片|*.jpg|Bmp 图片|*.bmp|Gif 图片|*.gif|Png 图片|*.png|Wmf  图片|*.wmf";
            saveFileDialog1.FilterIndex = 0;
            saveFileDialog1.RestoreDirectory = true;//保存对话框是否记忆上次打开的目录
            saveFileDialog1.CheckPathExists = true;//检查目录
            saveFileDialog1.FileName = System.DateTime.Now.ToString("yyyyMMddHHmmss") + "-"; ;//设置默认文件名
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                bitmap.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);// image为要保存的图片
                MessageBox.Show(this, "图片保存成功!", "信息提示");
            }
            bitmap.Dispose();
        }
        private void button2_Click_1(object sender, EventArgs e)
        {
            videoPlayer1.SignalToStop();
            videoPlayer1.WaitForStop();
            this.Close();
        }
        private void Form2_Load(object sender, EventArgs e)
        {}
    }
}

using Microsoft.DirectX.DirectSound;
using System;
using System.Threading;
using System.Windows.Forms;
namespace CameraTest
{
    public partial class Form3 : Form
    {
        private const int SAMPLES = 8;
        private static int deviceIndex = -1;
        private CaptureBuffer buffer=null;
        private static Capture cap = null;  
        private string deviceName = "没有检测到音频输入设备";

        ///
        // *****更改处
        ///
        private static AutoCompleteStringCollection deviceNames;
        private Thread liveVolumeThread;
        private int sampleDelay = 100;
        private int frameDelay = 10;
        private static int[] SAMPLE_FORMAT_ARRAY = { SAMPLES, 2, 1 };
        public Form3()
        {
            InitializeComponent();
            progressBar1.Maximum = Int16.MaxValue + 1;
            CheckForIllegalCrossThreadCalls = false;
        }
        /// 
        /// 加载麦克风列表
        /// 
       
        public void Stop()
        {
            if (liveVolumeThread != null)
            {
                liveVolumeThread.Abort();
                liveVolumeThread.Join();
                liveVolumeThread = null;
            }

            if (buffer != null)
            {
                if (buffer.Capturing)
                {
                    buffer.Stop();
                }

                buffer.Dispose();
                buffer = null;
            }
        }

        public void Start()
        {
            Stop();
            if (deviceIndex != -1)
            {
                // capture 对象 捕获麦克风设备

                ///
                // *****更改处
                ///
                CaptureDevicesCollection audioDevices = new CaptureDevicesCollection();
                cap = new Capture(audioDevices[deviceIndex].DriverGuid);
                // 创建对 缓冲区信息 的描述
                CaptureBufferDescription desc = new CaptureBufferDescription();
                WaveFormat wf = new WaveFormat();
                wf.BitsPerSample = 16;
                wf.SamplesPerSecond = 44100;
                wf.Channels = 2;
                // 数据的最小的原子单元
                wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8);
                // 单位采样点的字节数
                wf.AverageBytesPerSecond = wf.BlockAlign * wf.SamplesPerSecond;
                // 未经压缩的PCM
                wf.FormatTag = WaveFormatTag.Pcm;

                desc.Format = wf;
                desc.BufferBytes = SAMPLES * wf.BlockAlign;
                // 创建 capturebuffer对象
                buffer = new CaptureBuffer(desc, cap);
                // 捕捉数据至缓存
                buffer.Start(true);

                liveVolumeThread = new Thread(new ThreadStart(updateProgress));
                liveVolumeThread.Priority = ThreadPriority.Lowest;
                liveVolumeThread.Start();
            }
        }
        private void updateProgress()
        {
            while (true)
            {
                int tempFrameDelay = frameDelay;
                int tempSampleDelay = sampleDelay;
                ///
                // *****更改处
                ///
                label1.Text = "0";
                Array samples = buffer.Read(0, typeof(Int16), LockFlag.FromWriteCursor, SAMPLE_FORMAT_ARRAY);
                int goal = 0;
                for (int i = 0; i < SAMPLES; i++)
                {
                    goal += (Int16)samples.GetValue(i, 0, 0);
                }
                goal = (int)Math.Abs(goal / SAMPLES);
                double range = goal - progressBar1.Value;
                double exactValue = progressBar1.Value;
                double stepSize = range / tempSampleDelay * tempFrameDelay;
                if (Math.Abs(stepSize) < .01)
                {
                    stepSize = Math.Sign(range) * .01;
                }
                double absStepSize = Math.Abs(stepSize);

                if ((progressBar1.Value == goal))
                {
                    Thread.Sleep(tempSampleDelay);
                }
                else
                {
                    do
                    {
                        if (progressBar1.Value != goal)
                        {
                            if (absStepSize < Math.Abs(goal - progressBar1.Value))
                            {
                                exactValue += stepSize;
                               
                                progressBar1.Value = (int)Math.Round(exactValue);
                                ///
                                // *****更改处
                                ///
                            
                               if (int.Parse(label1.Text) > (int)Math.Round(exactValue)+100|| int.Parse(label1.Text)< (int)Math.Round(exactValue) - 100)
                                {
                                    label1.Text = Math.Round(exactValue).ToString();
                                    Application.DoEvents();
                                }
                            }
                            else
                            {
                                progressBar1.Value = goal;
                            }
                        }
                        Thread.Sleep(tempFrameDelay);
                    } while ((progressBar1.Value != goal));
                }
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Stop();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            CaptureDevicesCollection audioDevices = new CaptureDevicesCollection();
            deviceNames = new AutoCompleteStringCollection();
            for (int i = 0; i < audioDevices.Count; i++)
            {
                deviceNames.Add(audioDevices[i].Description);

                comboBox1.Items.Add(deviceNames[i].ToString());
                comboBox1.SelectedIndex = 0;
            }
            if (deviceNames.Count < 0)
            {
                comboBox1.Items.Clear();
                comboBox1.Items.Add(deviceName);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            deviceIndex = comboBox1.SelectedIndex;
            Start();
        }
        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void Form3_Load(object sender, EventArgs e)
        { }
    }
}


你可能感兴趣的:(C#)