音视频开发进阶指南(第六章)-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();
}


目录
相关文章
|
3月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
421 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
418 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
864 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
652 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
3月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
225 0
|
4月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
335 6
|
6月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
299 0
|
6月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
471 11
|
10月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
2908 77
|
7月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
369 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡

热门文章

最新文章