前言:

其实在Android中录音可以用MediaRecord录音,操作比较简单。但是不能对音频进行处理。考虑到项目中做的是实时语音只能选择AudioRecord进行录音。

本文算是对AudioRecord来个回顾:

public class AudioRecordManager {
public static final String TAG = "AudioRecordManager";
private AudioRecord mRecorder;
private DataOutputStream dos;
private Thread recordThread;
private boolean isStart = false;
private static AudioRecordManager mInstance;
private int bufferSize; public AudioRecordManager() {
bufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mRecorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize * 2);
} /**
* 获取单例引用
*
* @return
*/
public static AudioRecordManager getInstance() {
if (mInstance == null) {
synchronized (AudioRecordManager.class) {
if (mInstance == null) {
mInstance = new AudioRecordManager();
}
}
}
return mInstance;
} /**
* 销毁线程方法
*/
private void destroyThread() {
try {
isStart = false;
if (null != recordThread && Thread.State.RUNNABLE == recordThread.getState()) {
try {
Thread.sleep(500);
recordThread.interrupt();
} catch (Exception e) {
recordThread = null;
}
}
recordThread = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
recordThread = null;
}
} /**
* 启动录音线程
*/
private void startThread() {
destroyThread();
isStart = true;
if (recordThread == null) {
recordThread = new Thread(recordRunnable);
recordThread.start();
}
} /**
* 录音线程
*/
Runnable recordRunnable = new Runnable() {
@Override
public void run() {
try {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int bytesRecord;
//int bufferSize = 320;
byte[] tempBuffer = new byte[bufferSize];
if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
stopRecord();
return;
}
mRecorder.startRecording();
//writeToFileHead();
while (isStart) {
if (null != mRecorder) {
bytesRecord = mRecorder.read(tempBuffer, 0, bufferSize);
if (bytesRecord == AudioRecord.ERROR_INVALID_OPERATION || bytesRecord == AudioRecord.ERROR_BAD_VALUE) {
continue;
}
if (bytesRecord != 0 && bytesRecord != -1) {
//在此可以对录制音频的数据进行二次处理 比如变声,压缩,降噪,增益等操作
//我们这里直接将pcm音频原数据写入文件 这里可以直接发送至服务器 对方采用AudioTrack进行播放原数据
dos.write(tempBuffer, 0, bytesRecord);
} else {
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} }; /**
* 保存文件
*
* @param path
* @throws Exception
*/
private void setPath(String path) throws Exception {
File file = new File(path);
if (file.exists()) {
file.delete();
}
file.createNewFile();
dos = new DataOutputStream(new FileOutputStream(file, true));
} /**
* 启动录音
*
* @param path
*/
public void startRecord(String path) {
try {
setPath(path);
startThread();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 停止录音
*/
public void stopRecord() {
try {
destroyThread();
if (mRecorder != null) {
if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
mRecorder.stop();
}
if (mRecorder != null) {
mRecorder.release();
}
}
if (dos != null) {
dos.flush();
dos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
} }

使用前要添加如下权限:

<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

相关音频知识链接:

http://ticktick.blog.51cto.com/823160/1748506

最新文章

  1. mono中发送邮件并保存本次收件人的地址
  2. POJ1742Coins(并不理解是什么意思)
  3. ASP.NET MVC学习之模型验证篇
  4. Python学习笔记(1):列表元组结构
  5. commons-fileupload实现文件上传下载
  6. 利用HTML5的canvas制作万花筒动画特效
  7. day03-java
  8. SDOI2008仪仗队
  9. 【linux】linux根文件系统制作
  10. .Net Core Session验证码
  11. websphere部署 hibernate jpa &amp; Error 500: javax/persistence/OneToOne.orphanRemoval()Z
  12. Codeforces Round #261 (Div. 2)459D. Pashmak and Parmida&amp;#39;s problem(求逆序数对)
  13. redis 系列20 服务器上
  14. vs2012密钥
  15. PgAgent安装、配置、运行
  16. 2017 SCNUCPC 解题报告
  17. opendressinghash //use resize array
  18. 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
  19. Using Windows Server 2012 Backup for Hyper-V Virtual Machines. Error 80780176 - The specified component was not reported by the VSS writer.
  20. 【转】JAVA 并发编程-多个线程之间共享数据

热门文章

  1. 体育游戏中的Player类
  2. OSGEarth编译
  3. Ubuntu Java 环境变量
  4. Array.prototype.filter()的实现
  5. PHPExcel按单元格读取数据
  6. Centos 7 安装 设置 IP地址,DNS,主机名,防火墙,端口,SELinux (实测+笔记)
  7. VS调试程序时一闪而过的问题-解决方法(网上搜集)
  8. 10年微软MVP路(如何成为一个MVP?)
  9. TaintDroid剖析之Native方法级污点跟踪分析
  10. TDDL分库分表规则