前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Amr的录制与播放

Android Amr的录制与播放

作者头像
码客说
发布2019-10-22 14:32:45
2K0
发布2019-10-22 14:32:45
举报
文章被收录于专栏:码客

Amr录制并获取声音大小

定义对象

代码语言:javascript
复制
private MediaRecorder mMediaRecorder;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //要做的事情
        if (mMediaRecorder == null) return;
        double ratio = (double) mMediaRecorder.getMaxAmplitude() / 100;
        double db = 0;// 分贝
        //默认的最大音量是100,可以修改,但其实默认的,在测试过程中就有不错的表现
        //你可以传自定义的数字进去,但需要在一定的范围内,比如0-200,就需要在xml文件中配置maxVolume
        //同时,也可以配置灵敏度sensibility
        if (ratio > 1)
            db = 30 * Math.log10(ratio);
        
        //获取音量大小
        
        //只要有一个线程,不断调用这个方法,就可以使波形变化
        //主要,这个方法必须在ui线程中调用
        handler.postDelayed(this, 200);
    }
};

开始录制

代码语言:javascript
复制
private void startRecord() {
    if (mMediaRecorder == null) {
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        File file = new File(amrPath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        mMediaRecorder.setOutputFile(file.getAbsolutePath());
        mMediaRecorder.setMaxDuration(1000 * 60 * 10);
        try {
            mMediaRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mMediaRecorder.start();
    }

	//每200毫秒获取声音大小
    handler.postDelayed(runnable, 200);
}

停止录制

代码语言:javascript
复制
private void stopRecord() {
    handler.removeCallbacks(runnable);
    mMediaRecorder.stop();
    mMediaRecorder.release();
    mMediaRecorder = null;
}

Amr播放

定义对象

代码语言:javascript
复制
private MediaPlayer mPlayer = null;
String basePath = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator + "caiyun" + File.separator;
String amrPath = basePath+"temp.amr";

播放

代码语言:javascript
复制
void playVoice(String amrPath) {
    mPlayer = new MediaPlayer();
    mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            //播放完毕
        }
    });
    try {
        mPlayer.setDataSource(amrPath);
        mPlayer.prepare();
        mPlayer.start();
    } catch (IOException e) {
        Log.i(TAG, "playVoice: ");
    }
}

获取Amr时长

代码语言:javascript
复制
/**
 * 得到amr的时长
 * @param file
 * @return 毫秒
 * @throws IOException
 */
public static long getAmrDuration(File file) throws IOException {
    long duration = -1;
    int[] packedSize = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
    RandomAccessFile randomAccessFile = null;
    try {
        randomAccessFile = new RandomAccessFile(file, "rw");
        long length = file.length();//文件的长度
        int pos = 6;//设置初始位置
        int frameCount = 0;//初始帧数
        int packedPos = -1;
        byte[] datas = new byte[1];//初始数据值
        while (pos <= length) {
            randomAccessFile.seek(pos);
            if (randomAccessFile.read(datas, 0, 1) != 1) {
                duration = length > 0 ? ((length - 6) / 650) : 0;
                break;
            }
            packedPos = (datas[0] >> 3) & 0x0F;
            pos += packedSize[packedPos] + 1;
            frameCount++;
        }
        duration += frameCount * 20;//帧数*20
    } finally {
        if (randomAccessFile != null) {
            randomAccessFile.close();
        }
    }
    return duration;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Amr录制并获取声音大小
    • 定义对象
      • 开始录制
        • 停止录制
        • Amr播放
          • 定义对象
            • 播放
            • 获取Amr时长
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档