音视频开发进阶指南(第六章)-Android平台的音频采集-AudioRecord

简介: 笔记

Android SDK提供了两套音频采集的API,分别是:MediaRecorderAudioRecord。前者是一个更加上层的API,它可以直接对手机麦克风录入的音频数据进行编码压缩(如AMR,MP3等),并存储为文件;后者更加接近底层,能够更加灵活地控制,其可以让开发者得到内存中的PCM音频流数据。如果想做一个简单的录音机,输出音频文件,则推荐使用MediaRecorder;如果需要对音频做进一步的算法处理,或者需要采用第三方的编码库进行编码压缩,又或者需要用到网络传输等场景中,那么只能使用AudioRecord或者OpenSL ES,其实MediaRecorder底层也是调用了AudioRecord与Android Framework层的AudioFlinger进行交互的。至于OpenSL ES,请参考另一篇文章音视频开发进阶指南(第四章)-OpenSL-ES播放PCM音频

本章讲解如何使用AudioRecord录音音频,并使用AudioTrack播放


播放步骤


1. 初始化AudioRecord

private static final int SAMPLE_RATE = 44100;//采样率
private static final int CHANNEL_CONFIG_IN = AudioFormat.CHANNEL_IN_MONO;//通道配置
private static final int CHANNEL_CONFIG_OUT = AudioFormat.CHANNEL_OUT_MONO;//通道配置
private static final int ENCODING_FORMAT = AudioFormat.ENCODING_PCM_16BIT;//编码配置
private static final String PCM_FILE = "/mnt/sdcard/test.pcm";
private static final String TAG = "MainActivity";
int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG_IN, ENCODING_FO
mAudioRecord = new AudioRecord(
        MediaRecorder.AudioSource.DEFAULT,//默认音频源
        SAMPLE_RATE,    //采样率
        CHANNEL_CONFIG_IN, //通道
        ENCODING_FORMAT,    //表示格式
        minBufferSize); //最小缓存
//开启录音
mAudioRecord.startRecording();

读取音频数据并写入文件

/**
 * 读取音频数据并写入文件
 */
private void startReadThread() {
    Log.d(TAG, "startReadThread");
    new Thread() {
        @Override
        public void run() {
            super.run();
            short[] buf = new short[1024];//一次读取的音频数据大小
            BufferedOutputStream bos = null;
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(PCM_FILE);
                bos = new BufferedOutputStream(fos);
                while (mAudioRecord.read(buf, 0, buf.length) > 0) {
                    //把short转为字节数组
                    byte[] bytes = ArrayUtil.toByteArraySmallEnd(buf);
                    bos.write(bytes);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bos.close();
                    fos.close();
                    if (mAudioRecord != null) {
                        mAudioRecord.stop();
                        mAudioRecord.release();
                        mAudioRecord = null;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

使用AudioTrack进行播放

private void play() {
    File file = new File(PCM_FILE);
    if (!file.exists()) {
        Toast.makeText(this, "请先开始录音", Toast.LENGTH_SHORT).show();
        return;
    }
    int minBufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG_OUT, ENCODI
    mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            SAMPLE_RATE,
            CHANNEL_CONFIG_OUT,
            ENCODING_FORMAT,
            minBufferSize,
            AudioTrack.MODE_STREAM);
    mAudioTrack.play();
    new Thread() {
        @Override
        public void run() {
            super.run();
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            byte[] buf = new byte[1024];
            try {
                fis = new FileInputStream(PCM_FILE);
                bis = new BufferedInputStream(fis);
                int read = 0;
                while ((read = bis.read(buf)) > 0) {
                    mAudioTrack.write(buf, 0, read);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bis.close();
                    fis.close();
                    if (mAudioTrack != null) {
                        mAudioTrack.stop();
                        mAudioTrack.release();
                        mAudioTrack = null;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}


目录
相关文章
|
7天前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
12 0
|
2月前
|
Android开发 开发者 iOS开发
APP开发后如何上架,上架Android应用市场前要准备什么
移动应用程序(APP)的开发已经成为现代企业和开发者的常见实践。然而,开发一个成功的APP只是第一步,将其上架到应用商店让用户下载和使用是实现其潜力的关键一步。
|
4天前
|
存储 SQL 数据库
安卓移动应用开发(安卓系统开发教程)
安卓移动应用开发(安卓系统开发教程)
24 1
|
7天前
|
Java Android开发 C++
安卓SO层开发 -- 第一个NDK项目
安卓SO层开发 -- 第一个NDK项目
6 0
|
7天前
|
算法 Java Android开发
安卓逆向 -- NDK开发实现MD5算法
安卓逆向 -- NDK开发实现MD5算法
11 0
|
1月前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
23 0
|
2月前
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
|
Android开发
Android平台设计规范整理(尺寸+组成元素+字体+滑块)
转自:http://www.ui.cn/project.php?id=12394
659 0

相关产品

  • 云迁移中心