美文网首页Android专题
安卓并行录音:PCM编码为AMR格式

安卓并行录音:PCM编码为AMR格式

作者: DD_Dog | 来源:发表于2019-02-20 10:52 被阅读99次

    需求

    项目中需要进行并行录音,即:

    1. 录音PCM数据,通过Socket发送到客户端
    2. 本地保存一份amr格式的音频文件

    可行的方法

    安卓中有两种方式可以录制音频:

    1. AudioRecorder 更灵活,如果需要特定格式的音频需要自己来做工作
    2. MediaRecorder 封装性更好,可以直接录音特定格式的音频,但是拿不到原始PCM数据

    但是有一点AudioRecorder和MediaRecorder在安卓系统中不能同时工作,所以我采用的方法是:通过AudioRecorder录制,再进行编码为AMR格式。

    实现

    1. 首先是要使用AudioRecorder进行录制,这个网上很多用例。
    2. PCM编码为AMR格式,使用的是一个开源库opencore-amr-android,它可以直接把PCM数据转为AMR格式

    遇到的问题

    由于PCM要求为16K采样率,16BIT精度,而AMR_NB格式为8k采样,所以如果直接进行编码会导致声音低沉且速度变慢。
    这时就需要重采样,即把16K采样率下采样为8K采样率,具体算法如下 :

        /**
         * 下采样 16K-8K
         *
         * @param in
         * @return
         */
        private short[] downSample(short[] in) {
            short[] down = new short[in.length / 2];
            for (int i = 0, j = 0; i < in.length; i += 2, j++) {
                down[j] = in[i];
            }
            return down;
        }
    

    进行重采样后再进行AMR编码就正常了。

    相关文章

      网友评论

        本文标题:安卓并行录音:PCM编码为AMR格式

        本文链接:https://www.haomeiwen.com/subject/uxecyqtx.html