IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓音视频开发(2)—— AudioRecord采集pcm音频 -> 正文阅读

[移动开发]安卓音视频开发(2)—— AudioRecord采集pcm音频

安卓SDK提供了两种音频采集的api,MediaRecorder和AudioRecord,相较于前者,后者更接近底层,能够更加灵活的控制。我们学习音视频开发,都是直接对原始的pcm音频进处理包括降噪、增益等。

所需权限

权限的申请自行解决。

 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

AudioRecord参数

  • audioSource:音频输入源,通常为MediaRecorder.AudioSource.MIC(麦克风),此外还有VOICE_CALL、CAMCORDER等等,这里不一一赘述。

  • sampleRateInHz:采样率,目前44100Hz可以保证兼容所有的手机。

  • channelConfig:通道数,同上为了兼容性一般为AudioFormat.CHANNEL_IN_MONO(单通道)。

  • audioFormat:数据位宽,常用16bit可以兼容所有android手机。

  • bufferSizeInBytes:缓冲区大小,这个根据 采样率x位宽x采样时间x通道数 计算得来。

    // 音频输入-麦克风
    private final static int AUDIO_INPUT = MediaRecorder.AudioSource.MIC;
    //8K采集率
    private final static int AUDIO_SAMPLE_RATE = 8000;
    //格式
    private final static int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
    //16Bit
    private final static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
    // 缓冲区字节大小
    private int bufferSizeInBytes = 1600;

音频录制流程

1.初始化AudioRecord对象,注意其最小录音缓存buffer,可以使用getMinBufferSize得到。

    public void init(Context context) {
        //检查权限
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        audioRecord = new AudioRecord(AUDIO_INPUT, AUDIO_SAMPLE_RATE,
                CHANNEL_CONFIG, AUDIO_FORMAT, bufferSizeInBytes);
        LogUtils.i("初始化成功");
    }

2.初始化一个buffer(用于保存新的录音数据),其大小等于第一步中的缓存buffer大小。

        byte[] audiodata = new byte[bufferSizeInBytes];

3.开始录音,通常另起线程,创建数据流,同时设置正在录音标志flag来控制停止录音。

4.开始采集,一边从AudioRecord读取声音数据,一边将buffer写入数据流。

5.停止录音,将录音标志置为false,关闭数据流。

    public void start() {
        if (isRecord) {
            LogUtils.i("正在录音");
            return;
        }
        LogUtils.i("开始录音");
        isRecord = true;
        audioRecord.startRecording();
        audioHandle = new Thread(() -> saveFile());
        audioHandle.start();
    } 

    private void saveFile() {
        byte[] audiodata = new byte[bufferSizeInBytes];
        FileOutputStream fos = null;
        try {
            File file = new File(filePath);
            if (file.exists()) {
                file.delete();
            }
            fos = new FileOutputStream(file);
        } catch (Exception e) {
            e.printStackTrace();
        }

        while (isRecord) {
            int readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
            if (fos != null) {
                try {
                    fos.write(audiodata);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        try {
            if (fos != null) {
                fos.close();// 关闭写入流
            }
        } catch (IOException e) {

        }
    } 

    public void stop() {
        isRecord = false;
        LogUtils.i("停止录音");
    }

6.释放资源。

    public void release() {
        if (audioRecord != null) {
            isRecord = false;
            audioRecord.release();
            audioRecord = null;
            audioHandle.interrupt();
            audioHandle = null;
            LogUtils.i("释放");
        }
    }

结语

录制是否成功,可以去对应的文件目录下查看是否有相应的pcm文件,下节讲述pcm文件的播放。

本期博客参考:

灰色飘零博客园

你的阿爸博客

需要源码的盆友也可以访问我的gitlub,我的gitlub源码

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:53:18  更:2022-10-08 20:54:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 5:04:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码