在网络聊天系统中,实现麦克风录音与播放,是最基础的模块之一。本文我们就介绍如何快速地实现这个基础模块。

一. C#录音组件与播放基础知识

  有几个与声音采集和播放相关的专业术语必须要先了解一下,否则,后面的介绍将无法展开。语音采集指的是从麦克风采集音频数据,即声音样本转换成数字信号。其涉及到几个重要的参数:采样率、采样位数、声道数。

  简单的来说:

采样率:即采样频率,就是在1秒内进行采集动作的次数。

采样位数:又叫采样深度,就是每次采集动作得到的数据长度,即使用多少个bit来记录一个样本。

声道数:一般是单声道或双声道(立体声)。普通的麦克风采集几乎都是单声道的。

  这样,1秒钟采集得到的声音数据的大小为(单位byte):(采样频率×采样位数×声道数×时间)/8。

  音频帧:通常一个音频帧的时长为10ms,即每10ms的数据构成一个音频帧。假设:采样率16k、采样位数16bit、声道数1,那么一个10ms的音频帧的大小为:(16000*16*1*0.01)/8 = 320 字节。计算式中的0.01为秒,即10ms

二. 如何实现麦克风录音与播放

  如果直接基于底层的DirectX来进行麦克风的采集与播放,那将是十分繁琐的。好在我们有现成的组件来完成这个工作,MCapture用于采集硬件设备(如麦克风、摄像头、声卡、屏幕等),MPlayer用于播放采集到的数据。

1.采集麦克风

  MCapture提供了IMicrophoneCapturer,用于采集麦克风输入的声音。其每隔20ms触发一次AudioCaptured事件,通过事件的参数byte[]暴露这20ms采集得到的数据。

  IMicrophoneCapturer 相关采集参数的值是这样的:

采样频率:16000,采样位数:16bit,声道数:1。

所以,按照上面的公式进行计算,我们可以得到AudioCaptured事件的参数byte[]的长度为640。

2. 播放声音数据

  MPlayer提供了IAudioPlayer,用于播放声音数据。在创建IAudioPlayer实例时,要正确的设置采样频率、采样位数、声道数这些参数的值,如果它们与即将要播放的声音数据的特征不一致,播放将出现错误。

  我们在拿到MCapture采集的声音数据后,将其提交给IAudioPlayer的Play方法进行播放即可。

三.录音与播放Demo源码

  在有了前面的介绍作为基础后,接下来实现麦克风的采集和播放就相当简单了。在接下来的demo中,不仅演示了播放从麦克风采集到的声音,而且多加了一个功能,就是直接播放wav声音文件,这些实现都是相当简单的。  

    public partial class Form1 : Form{private IAudioPlayer audioPlayer;private IMicrophoneCapturer microphoneCapturer;public Form1(){InitializeComponent();}private void button_mic_Click(object sender, EventArgs e){try{this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(int.Parse(this.textBox_mic.Text));this.microphoneCapturer.AudioCaptured += new ESBasic.CbGeneric<byte[]>(microphoneCapturer_AudioCaptured);this.audioPlayer = PlayerFactory.CreateAudioPlayer(int.Parse(this.textBox_speaker.Text), 16000, 1, 16, 2);this.microphoneCapturer.Start();this.label_msg.Text = "正在采集麦克风,并播放 . . .";this.label_msg.Visible = true;this.button_wav.Enabled = false;this.button_mic.Enabled = false;this.button_stop.Enabled = true;}catch (Exception ee){MessageBox.Show(ee.Message);}}void microphoneCapturer_AudioCaptured(byte[] audioData){if (this.audioPlayer != null){this.audioPlayer.Play(audioData);}}private void button_wav_Click(object sender, EventArgs e){try{string path = ESBasic.Helpers.FileHelper.GetFileToOpen2("请选择要播放的wav文件", AppDomain.CurrentDomain.BaseDirectory, ".wav");if (path == null){return;}AudioInformation info = PlayerFactory.ParseWaveFile(path);if (info.FormatTag != (int)WaveFormats.Pcm){MessageBox.Show("仅仅支持PCM编码方式的语音数据!");return;}int secs = info.GetTimeInMsecs() / 1000; //声音数据的播放时长this.audioPlayer = PlayerFactory.CreateAudioPlayer(int.Parse(this.textBox_speaker.Text), info.SampleRate, info.ChannelCount, info.BitsNumber, secs + 1);this.audioPlayer.Play(info.AudioData);this.label_msg.Text = "正在播放wav文件 . . .";this.label_msg.Visible = true;this.button_wav.Enabled = false;this.button_mic.Enabled = false;this.button_stop.Enabled = true;}catch (Exception ee){MessageBox.Show(ee.Message);}}private void Form1_FormClosing(object sender, FormClosingEventArgs e){if (this.microphoneCapturer != null){this.microphoneCapturer.Stop();this.microphoneCapturer.Dispose();this.microphoneCapturer = null;}if (this.audioPlayer != null){this.audioPlayer.Dispose();this.audioPlayer = null;}}private void button_stop_Click(object sender, EventArgs e){if (this.audioPlayer == null){return;}if (this.microphoneCapturer != null){this.microphoneCapturer.Stop();this.microphoneCapturer.Dispose();this.microphoneCapturer = null;}this.audioPlayer.Clear();this.audioPlayer.Dispose();this.audioPlayer = null;this.label_msg.Visible = false;this.button_wav.Enabled = true;this.button_mic.Enabled = true;this.button_stop.Enabled = false;}        }

  看看demo运行的效果图:

  

   麦克风录音与播放Demo源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

C#麦克风录音组件与播放源码相关推荐

  1. Android Jetpack 组件之 Lifecycle源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  2. react 调用组件方法_React源码分析1 — 组件和对象的创建(createClass,createElement)...

    1 组件的创建 学习了半年前端了,感觉前端的水确实也很深.做安卓的时候就对React-Native比较感兴趣,开发H5时也使用了一段时间的ReactJS.所以决定好好分析下它的源码.文章中有不对的地方 ...

  3. ⑥NuPlayer播放源码分析之DecoderBase分析

    NuPlayer播放源码分析之DecoderBase分析 [时间:2017-02] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,DecoderBase,Med ...

  4. 【Matlab语音识别】电话按键语音识别(含按键录音)【含源码 1752期】

    一.代码运行视频(哔哩哔哩) [Matlab语音识别]电话按键语音识别(含按键录音)[含源码 1752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆 ...

  5. Android四大组件之bindService源码实现详解

        Android四大组件之bindService源码实现详解 Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindServic ...

  6. C#开源录音组件、录像组件、录屏组件及demo源码

    在多媒体系统中,一般都会涉及到录音.录像.录屏问题,采集得到的数据可以用来传输.播放.或存储.所以,对于像课件录制系统.语音视频录制系统.录屏系统等,多媒体数据的采集就是最基础的功能之一. MCapt ...

  7. animation基础练习源码_用vue简单写一个音乐播放组件「附源码」

    作者:vipbic 转发链接:https://segmentfault.com/a/1190000022980992 前言 上次小编也分享一个关于Vue 开发过音乐播放对项目: 基于 electron ...

  8. vue从哪看组件版本_VUE源码解析之路

    Vue 是一个 MVVM 框架,一个数据响应式的组件系统,通过把页面抽象成一个个组件来增加复用性,降低复杂性,提高维护便利性.所以重要的事情说三遍: 页面一个视图区域抽象成组件,通用型工具抽出公共组件 ...

  9. 小程序loding动画组件封装及源码

    效果图如下 使用方法示例 wxml <progress percentage="{{percentage}}" wx:if="{{lodingType != ''} ...

最新文章

  1. 利用循环,使得10 * 10的二维数组具有以下值,并按以下结构输出在屏幕上
  2. (转)解决ubuntu下拼音输入法出错的问题
  3. 转载:逻辑思维提升表达
  4. 【图文教程】Ubuntu software解决下载速度过慢
  5. python print 输出到txt_Python的print()输出形式
  6. mysql parameter_C#MySqlParameter问题
  7. spring与struts2整合出现错误HTTP Status 500 - Unable to instantiate Action
  8. iPhone 12s Pro渲染图曝光:屏幕和相机将成升级重点
  9. jquery实现某宝放大点击切换
  10. php mcrypt取消,准备在PHP 7.2中删除Mcrypt
  11. 从零基础入门Tensorflow2.0 ----六、31 kaggle 10 monkeys模型微调
  12. 自动化测试介入的时机
  13. 解决markdown快捷键在输入法和chrome浏览器下的冲突问题
  14. Java实现下载图片
  15. 移动政务中的小程序技术
  16. t00ls.net关闭了
  17. 我们为什么要结婚?(
  18. 云南省科协第十届学术年会在曲靖开幕
  19. Seq2Seq模型中的贪心搜索(Greedy Search)
  20. 千万别在老家买房了,因为那儿通高铁

热门文章

  1. 网络分流器的分类-网络分流器的功能区分?
  2. KitKat - The Lazy/Poor Man's Rootkit
  3. 在移动互联网上,图像识别Face++可以做什么?
  4. 音视频编解码 文件格式 协议内容详解
  5. BrainCo头环,致力于提升儿童脑智发育
  6. UE4-【C++/蓝图】【UE4使用坑点】
  7. 担心隐私泄露?Dline打造可信社交
  8. 【从零开始のIC学习笔记】-SPI
  9. HTML5期末大作业:HTML+CSS+JavaScript+BootStrap 简约的旅游图文相册博客HTML模板
  10. day10string