zoukankan      html  css  js  c++  java
  • C#硬件访问(摄像头、麦克风)

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    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;
          }
          /// <summary>
          /// 加载麦克风列表
          /// </summary>
          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)
    { }
      }
    }

  • 相关阅读:
    数据仓库的一些理解(转)
    常见ETL工具一览,你知多少?
    dhcpv6开源软件配置
    svn
    js原型模式
    combo扩展:禁止手工改变输入框的值
    SQLite错误总结 error code 19: constraint failed
    ntp源码解读(一)
    ntp-keygen.c
    6.2.2认证
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14828029.html
Copyright © 2011-2022 走看看