上一篇介绍了如何使用Mediarecorder来录音,以及播放录音。不过并没有达到我的目的,一边录音一边播放。今天就讲解一下如何一边录音一边播放。使用AndioRecord录音和使用AudioTrack回放。参考了网上一位开发者的例子代码开发,最后会给出相关Demo。

(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)

1、AndioRecord类介绍

  AndioRecord类的主要功能是让各种JAVA应用能够管理音频资源,以便它们通过此类能够录制平台的声音输入硬件所收集的声音。此功能的实现就是通过”pulling同步”(reading读取)AudioRecord对象的声音数据来完成的。在录音过程中,应用所需要做的就是通过后面三个类方法中的一个去及时地获取AudioRecord对象的录音数据. AudioRecord类提供的三个获取声音数据的方法分别是read(byte[], int, int), read(short[], int, int), read(ByteBuffer, int)。 无论选择使用那一个方法都必须事先设定方便用户的声音数据的存储格式。然后再使用AudioTrack实时回放声音即可。

  下面是使用AudioRecord的过程中,可能会遇到的返回值,对于定位问题的原因很有用,解析很简单,我就不翻译了。

2、AudioRecord初始化

//Edited by mythou
//http://www.cnblogs.com/mythou/
// AudioRecord 得到录制最小缓冲区的大小
m_in_buf_size = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT);// 实例化播放音频对象
m_in_rec = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT, m_in_buf_size);

  AudioRecord的初始化参数比较多,需要注意设置。这几个参数都是标准的声音采集的参数,下面我针对这几个参数做个介绍,实际使用的时候,你可以根据你的情况设置。

AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

  AudioRecord构造参数的参数解析,可以根据实际情况调整:

audioSource 音频源:指的是从哪里采集音频。这里我们是从麦克风采集音频,所以此参数的值为MIC。可以参考MediaRecorder.AudioSource类,查看其他音频源。
sampleRateInHz 采样率:音频的采样频率,每秒钟能够采样的次数,采样率越高,音质越高。给出的实例是44100、22050、11025但不限于这几个参数。例如要采集低质量的音频就可以使用4000、8000等低采样率。
channelConfig 声道设置:android支持双声道立体声和单声道。MONO单声道,STEREO立体声
audioFormat 编码制式和采样大小:采集来的数据当然使用PCM编码(脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。) android支持的采样大小16bit 或者8bit。当然采样大小越大,那么信息量越多,音质也越高,现在主流的采样大小都是16bit,在低质量的语音传输的时候8bit 足够了。
bufferSizeInBytes 采集数据需要的缓冲区的大小,如果不知道最小需要的大小可以在getMinBufferSize()查看。

  

  

  上面是针对AudioRecord的初始化参数做了详细阐述,这个对于使用AudioRecord十分重要,也影响了录音和后期播放的效果,所以在你使用AudioRecord进行录音前,请仔细熟悉上面参数。

3、录音

    
//Edited by mythou
//http://www.cnblogs.com/mythou/
     //    录音线程class recordSound implements Runnable{@Overridepublic void run(){Log.d(TAG, "........recordSound run()......");byte[] bytes_pkg;// 开始录音
            m_in_rec.startRecording();while (flag){m_in_rec.read(m_in_bytes, 0, m_in_buf_size);bytes_pkg = m_in_bytes.clone();Log.i(TAG, "........recordSound bytes_pkg==" + bytes_pkg.length);if (m_in_q.size() >= 2){m_in_q.removeFirst();}m_in_q.add(bytes_pkg);}}}

  这里录音使用的是read()方法来读取录音的数据,并且把录音放到一个独立线程执行,读取到的录音数据,放入到队列里面,供播放线程使用。下面我们看看播放线程:

4、播放录音

//Edited by mythou
//http://www.cnblogs.com/mythou/
     //播放线程class playRecord implements Runnable{@Overridepublic void run(){Log.d(TAG, "........playRecord run()......");byte[] bytes_pkg = null;// 开始播放
            m_out_trk.play();while (flag){try{m_out_bytes = m_in_q.getFirst();bytes_pkg = m_out_bytes.clone();m_out_trk.write(bytes_pkg, 0, bytes_pkg.length);} catch (Exception e){e.printStackTrace();}}}}

  播放录音和录音过程大致一样,都是一个独立线程,这里需要注意的是,录音和播放都是开了独立的线程,而不是放在UI线程执行,至于原因不用我多说,大家应该都明白。

 5、解决异常

  下面把我调试过程中遇到的一个问题分享一下:

08-06 20:08:25.032: E/AndroidRuntime(32389): FATAL EXCEPTION: Thread-2063
08-06 20:08:25.032: E/AndroidRuntime(32389): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
08-06 20:08:25.032: E/AndroidRuntime(32389):     at android.media.AudioRecord.startRecording(AudioRecord.java:540)
08-06 20:08:25.032: E/AndroidRuntime(32389):     at com.apical.AuxIn.AudioNowRecord$recordSound.run(AudioNowRecord.java:131)
08-06 20:08:25.032: E/AndroidRuntime(32389):     at java.lang.Thread.run(Thread.java:856)

  出现上面问题的原因是录音的硬件资源被申请了,但是没有释放,然后你再次申请资源,导致初始化失败。这里需要注意的是不仅仅需要调用Release()方法。还需要把AudioRecord对象置为null,否则还是释放失败。下面是Android 开发网上面的一个对于AudioRecord的释放说明。

Releases the native AudioRecord resources. The object can no longer be used and the reference should be set to null after a call to release()。

6、结语

  上面就是一边录音一边播放的大致代码流程,主要就是AudioRecord和AudioTrack的使用,实际使用的时候,你需要根据自己的实际情况,调试AudioRecord的音频采样参数和回放的参数,达到你想要的效果。另外这个功能也能实现KTV的回声效果。自己调试一下参数即可。

  下面给出一个网络上的demo,是一位叫吴辰彪的开发者分享的,因为我是在CSDN下载的这个Demo,只从代码中看到作者名字。感谢这位开发者分享了这个录音回放的Demo。

录音回放Demo:RecordPlay2013-8-7.rar

相关文章:

Android 录音和播放

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3241925.html 

Android实现边录音边播放相关推荐

  1. Android JNI实现录音和播放

    1.jni 部分开发,实现录音和播放 2.实现so库有效时间限制 /*** 引用和声明JNI库和函数的类*/public class RecoderJni {static {System.loadLi ...

  2. 【Android】自定义录音、播放动画View,让你的录音浪起来

    前言 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的波浪会根据声音的大小浪起来的~) 实现思路 然后,我们适当的来分析一下这 ...

  3. Android录音并播放(mp3或amr格式)

    Android项目中媒体是很多人头疼的一个问题,不仅仅因为处理起来很麻烦,而且不同的手机差别很大(和硬件,系统都有关系),今天就总结一下Android中的录音和播放,可保存成mp3或amr格式. 小米 ...

  4. Android开发之PCM录音实时播放的实现方法 | 边录音边播放 |PCM录音播放无延迟 | 录音无杂音 | 录音无噪音

    先说下录音得开启录音权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 然后录音 ...

  5. Android 实时录音和回放,边录音边播放 (KTV回音效果)

    原文地址为: Android 实时录音和回放,边录音边播放 (KTV回音效果) 上一篇介绍了如何使用Mediarecorder来录音,以及播放录音.不过并没有达到我的目的,一边录音一边播放.今天就讲解 ...

  6. Android 录音机小米商业项目开源代码 AudioRecord录音暂停 播放 Wav格式(音频二)

    Android MediaRecorder录音录像 暂停 继续录音 播放 ARM格式(音频一) https://blog.csdn.net/WHB20081815/article/details/88 ...

  7. Android按下录音录音动画效果 ,自定义录音、播放动画View

    Android按下录音录音动画效果 ,自定义录音.播放动画View https://download.csdn.net/download/abc2522/10327428?spm=1001.2101. ...

  8. android 录音与播放录音 带根据音频大小动态效果

    先看看效果图:         首先是布局文件: <?xml version="1.0" encoding="utf-8"?> <Linear ...

  9. Android录音与播放

    Android多媒体框架包含获取和编码多种音频格式的支持,所以你可以轻松地把音频合并到你的应用中.如果设备支持,你可以使用MediaRecorder APIs 进行录音. 本章向你展示如何写一个应用从 ...

  10. Android 录音和播放

    原文地址:Android 录音和播放 今天主要讲解一下使用MediaRecorder 实现录音,主要是参照Android官网介绍来说明. 今天讲的并不能实现一边录音一边播放,下一篇文章我再说如何解决这 ...

最新文章

  1. Windows server 2003共享文件夹问题
  2. 腾讯云为小游戏开发者升级工具箱 小游戏联机对战引擎免费用
  3. 如何使用单线程处理高并发
  4. Chapter7-7_Deep Learning for Coreference Resolution
  5. Vue中computed分析
  6. Three.js_使obj模型旋转
  7. 无版权素材网站,免费、可商用
  8. git分支的拉取和获取master分支最新代码
  9. python黑色的_python怎么设置黑色背景
  10. 力扣887题-鸡蛋掉落
  11. Kali Linux 初探
  12. mysql 集群 运维_【MySQL运维】Canal集群模式与多数据库同步部署
  13. sqlserver 项目中连接失败,驱动程序无法通过使用安全套接字层(SSL) 与 java.security.cert.CertificateException
  14. Opencv:如何调用IP摄像头
  15. c语言程序员爱情,程序员的表白 (C语言代码)
  16. 兔子繁殖问题。假设有一对小兔子,一个月后成长为一对大兔子,从 第二个月开始,每对大兔子生一对小兔子。不考虑兔子的死亡,求第n个月的兔子总对数
  17. ProximitySensor校准
  18. 蚁剑连接php3,利用中国蚁剑无文件连接 phpstudy 后门方法
  19. TensorFlow识别图片数字
  20. 这就是波士顿动力第一款商用产品「机器狗」Spot

热门文章

  1. Spring Boot 应用在 kubernetes 的 sidecar 设计与实战
  2. 22二叉树非递归遍历算法
  3. C/C++的刷题练习之牛客网,一个友好的网站
  4. 范围管理之创建WBS
  5. 2009年计算机一级考试真题及答案
  6. 软件工程——概要设计
  7. 3D动漫游戏建模很难学?教你如何使用3DMax和ZBrush制作卡通角色
  8. IOS越狱运行Linux,iOS 13.4.1 Linux 简易越狱,重启就能打开
  9. uni-app广告总结
  10. Apple watch无法登陆网易云音乐