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)
{ }
}
}
C#硬件访问(摄像头、麦克风)的更多相关文章
- 升级iOS10之后调用摄像头/麦克风等硬件程序崩溃闪退的问题
在升级到iOS10之后, 开发过程中难免会遇到很多的坑, 下面是一些常见的坑, 我做了一些整理, 希望对大家开发有帮助: &1. 调用视频,摄像头, 麦克风,等硬件程序崩溃闪退的问题: 要注意 ...
- 1┃音视频直播系统之浏览器中通过WebRTC访问摄像头
一.WebRTC的由来 对于前端开发小伙伴而言,如果用 JavaScript 做音视频处理 在以前是不可想象的,因为首先就要考虑浏览器的性能是否跟得上音视频的采集 但是 Google 作为国际顶尖科技 ...
- Android驱动入门-LED--HAL硬件访问服务层②
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21 16:58:56 为了避免访问冲突,则创建了硬件访 ...
- 2.Android硬件访问服务编写系统代码【转】
本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-) ...
- LED硬件访问服务(2)——JNI/HAL
一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...
- 硬件访问服务学习笔记_WDS
1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...
- EasyDarwin+ffmpeg进行PC(摄像头+麦克风)流媒体直播服务
上一回我们描述了用EasyDarwin+ffmpeg进行摄像机直播的过程:ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播 我们再进行一个方面的描述,那就是pc摄像头+麦克 ...
- 6.1、Android硬件访问服务之框架
1.通过前面led点亮的例子,其流程如下 Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1.JNI_Onload 2.jn ...
- Android系统编程入门系列之硬件交互——多媒体麦克风
在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备, ...
随机推荐
- sql-1-准备
一.准备工作 1.mysql安装和配环境 不要以exe文件安装,要下载压缩包安装 下载地址:https://dev.mysql.com/downloads/mysql 在系统path中加上bin目录 ...
- R在ubuntu16.04上环境搭建
1.R安装 sudo apt-get update sudo apt-get remove vim-common sudo apt-get install vimapt-cache show r-ba ...
- 开发工具IDE从入门到爱不释手(五)更多实用操作
更多实用技巧 Tabs分屏和独立 日志链接及浏览器 设置浏览器 本地修改历史 三秒钟不操作,自动保存一个版本 右键--Local History--Show History 查看方法调用情况 按住方法 ...
- 爬取千千小说 -- xpath
今天以其中一本小说为例,讲一下下载小说的主体部分,了解正常的爬取步骤,用到的是request和xpath. 爬取数据三步走:访问url -->爬取数据 -->保存数据 一.访问千千小说网址 ...
- Python基础之控制台打印不同颜色字符串
参考文章:https://www.cnblogs.com/daofaziran/p/9015284.html 打印各种颜色的文字,但是需要传入文字 print_color.py "" ...
- SpringMVC中文乱码踩坑
问题 使用SpringMVC在返回一个字符串时发生了中文乱码问题.produces属性无效 @RequestMapping(value = "/nihao", produces = ...
- Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)
Java 使用 CommonsMath3 的线性和非线性拟合实例,带效果图 例子查看 GitHub Gitee 运行src/main/java/org/wfw/chart/Main.java 即可查看 ...
- [JS]回调函数和回调地狱
回调函数 小明在奶茶店点了奶茶,店员开始制作奶茶,此时"制作奶茶"与"小明等待奶茶"是一个同时进行的不同的两个事件(任务),那么,小明获取店员制作成功的奶茶是从 ...
- Spring Cloud 专题之六:bus
书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...
- Mybatis学习笔记-注解开发
面向接口编程 根本原因:[解耦],[可拓展],[更高规范性] 接口类型: abstract class interface 使用注解开发 简单语句可用注解开发(直接查询,列名与属性名相同) 本质:反射 ...