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


目录
相关文章
|
8天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
12天前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
|
9天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发环境对比:选择适合你的平台
【9月更文挑战第26天】在移动应用开发的广阔天地中,安卓和iOS是两大巨头。它们各自拥有独特的优势和挑战,影响着开发者的选择和决策。本文将深入探讨这两个平台的开发环境,帮助你理解它们的核心差异,并指导你根据个人或项目需求做出明智的选择。无论你是初学者还是资深开发者,了解这些平台的异同都至关重要。让我们一起探索,找到最适合你的那片开发天地。
|
11天前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
11天前
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
|
11天前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
Android开发
Android平台设计规范整理(尺寸+组成元素+字体+滑块)
转自:http://www.ui.cn/project.php?id=12394
715 0
|
5天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
22 7
下一篇
无影云桌面