Android 录音实现(MediaRecorder)

本文介绍了在Android项目中如何利用MediaRecorder和AudioRecord进行录音,对比了两者优缺点,重点讲解了MediaRecorder的使用方法,包括设置音频源、输出格式和编码,以及结束录音时的资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目中实现录音功能,并在逻辑中还有对录音文件的特殊要求,前前后后看了很多资料,学习了很多,今天在这里分享记录一下,以便后期回看。

Android提供了两个API用于录音的实现:MediaRecorder 和AudioRecord。

  1. MediaRecorder:录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。MediaRecorder已经集成了录音、编码、压缩等,并支持少量的录音音频格式,但是这也是他的缺点,支持的格式过少并且无法实时处理音频数据。

  2. AudioRecord:主要实现对音频实时处理以及边录边播功能,相对MediaRecorder比较专业,输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩。

MediaRecorder

MediaRecorder因为已经集成了录音、编码、压缩等功能,所以使用起来相对比较简单。

开始录音

MediaRecorder 使用起来相对简单,音频编码可以根据自己实际需要自己设定,文件名防止重复,使用了日期_时分秒的结构,audioSaveDir 是文件存储目录,可自行设定。下面贴出示例代码:


public void startRecord() {
    // 开始录音
    /* ①Initial:实例化MediaRecorder对象 */
    if (mMediaRecorder == null)
        mMediaRecorder = new MediaRecorder();
    try {
        /* ②setAudioSource/setVedioSource */
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
        /*
         * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
         * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
         */
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";
        if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {
            FileUtils.makeFolders(audioSaveDir);
        }
        filePath = audioSaveDir + fileName;
        /* ③准备 */
        mMediaRecorder.setOutputFile(filePath);
        mMediaRecorder.prepare();
        /* ④开始 */
        mMediaRecorder.start();
    } catch (IllegalStateException e) {
        LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());
    } catch (IOException e) {
        LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());
    }
}

上面代码只是基本使用方式,具体使用还需结合项目具体需求制定具体逻辑,但是MediaRecorder使用时需实例化,所以在不用时一定要记得即时释放,以免造成内存泄漏。

结束录音

public void stopRecord() {
    try {
        mMediaRecorder.stop();
        mMediaRecorder.release();
        mMediaRecorder = null;
        filePath = "";
    } catch (RuntimeException e) {
        LogUtil.e(e.toString());
        mMediaRecorder.reset();
        mMediaRecorder.release();
        mMediaRecorder = null;

        File file = new File(filePath);
        if (file.exists())
            file.delete();

        filePath = "";
    }
}

总结:MediaRecorder 实现录音还是比较简单的,代码量相对较少,较为简明,但也有不足之处,例如输出文件格式选择较少,录音过程不能暂停等。

参考链接http://www.cnblogs.com/Amandaliu/archive/2013/02/04/2891604.html 在链接内容基础上修改了amr编码格式为aac编码格式 Android提供了两个API用于实现录音功能:android.media.AudioRecord、android.media.MediaRecorder。 网上有很多谈论这两个类的资料。现在大致总结下: 1、AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩 示例: 使用AudioRecord类录音,并实现WAV格式封装。录音20s,输出的音频文件大概为3.5M左右(已写测试代码) 2、MediaRecorder 已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件 示例: 使用MediaRecorder录音,输出amr格式文件。录音20s,输出的音频文件大概为33K(已写测试代码) 3、音频格式比较 WAV格式:录音质量高,但是压缩率小,文件大 AAC格式:相对于mp3,AAC格式的音质更佳,文件更小;有损压缩;一般苹果或者Android SDK4.1.2(API 16)及以上版本支持播放 AMR格式:压缩比比较大,但相对其他的压缩格式质量比较差,多用于人声,通话录音 至于常用的mp3格式,使用MediaRecorder没有该视频格式输出。一些人的做法是使用AudioRecord录音,然后编码成wav格式,再转换成mp3格式 再贴上一些测试工程。 功能描述: 1、点击“录音WAV文件”,开始录音录音完成后,生成文件/sdcard/FinalAudio.wav 2、点击“录音AMR文件”,开始录音录音完成后,生成文件/sdcard/FinalAudio.amr 3、点击“停止录音”,停止录音,并显示录音输出文件以及该文件大小。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值