Android 实现能够暂停的录音功能

本文介绍如何在Android中实现音频录制的暂停功能,重点在于使用AudioRecord类录制原始PCM数据,通过android-aac-enc库将PCM数据编码为m4a格式,避免了MediaRecorder在合并m4a文件时的复杂性。详细讲述了实现思路、关键代码以及项目结构,适合需要暂停录音功能的开发者参考。
摘要由CSDN通过智能技术生成

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/40624267


      好久没更新博客了,着实有点惭愧,以后不管工作是忙是闲都得坚持更新博客,持之以恒地做下去!

       正式进入主题,今天我分享一个在工作中过程中遇到的一个技术难点以及我解决该难点的方案,该问题困扰了我许久,通过不断地研究和翻阅资料,终于在满足工作需求的情况下将该问题解决,希望我的经验能够对读者有所帮助。我们知道Android ApI提供了MediaRecorder和AudioRecord两个类给开发者来很方便地实现音视频的录制(前者可以实现音频和视频的录制,后者只能实现音频的录制)。这两个类都提供了start()和stop()方法用于开始和结束音频或视频的录制,但令人费解的是这两个类都没有提供pause()方法用于暂停录制音视频,因为在实际应用当中,暂停录制的功能是非常有必要的,暂不清楚Google工程师们在设计API时是如何考量的而没有添加这个方法,可能另有玄机吧。那既然Android自身没有提供这样一个方法,就只有我们自己来实现了,那么问题就来了,就是到底如何实现音频录制的暂停方法呢?别急,先讲一下我在工作中所遇到的需求,如下:需实现音频录制的暂停功能,并且生成的音频文件格式必须是m4a格式。为什么项目中音频文件一定要采用m4a格式的呢?有以下几点原因:

     1. 录制相同时间的音频,使用m4a格式存储的文件的大小要比使用其它格式类型存储的文件的大小要小(通过实验多次,在相同采样率16000的情况下,一般录制5分钟的音频,采用m4a格式存储的音频文件只有1.2Mb,而采用arm、mp3及其它格式的一般都有2-5Mb),这样当用户需要下载或上传录制的音频文件时,可以节省流量,并且相同压缩率的前提下,m4a格式音频的音质相比其它格式的也更高;
     2.产品同时拥有Android客户端和IOS客户端,那为了避免使用Android客户端的用户录制的音频上传到服务器之后,使用IOS客户端的用户下载下来发生无法播放的问题,我们需统一录制音频的存储格式。由于Iphone手机官方推荐的音频格式是m4a且对m4a格式的音频文件支持度较高,再综合第一点来看,于是我们选择m4a格式作为音频文件的存储格式。

    好了,解释了为什么音频录制文件必须使用m4a存储格式之后,接下来我们来解决如何实现音频的录制的暂停功能。前面讲了,Android SDK API提供了MediaRecorder和AudioRecord两个类来完成音视频的录制方法,我们看下它们两者之间的特点和区别:


MediaRecorder:

  特性:该类集成了录音、编码和压缩等功能,可根据设置的编码格式的参数直接生成各种格式的音频文件(如arm、               mp3或m4a等),由于集成度较高,因此使用起来简单,但灵活度不高,不能实现像AudioRecord那样进行音               频的实时处理。

AudioRecord:

  特性:该类录制的音频为原始的PCM二进制音频数据,没有文件头和文件尾,生成的PCM文件不能直接使用                         Mediaplayer播放,只能使用AudioTrack播放。使用AudioRecord可以实现边录边播的音频实时处理。


了解了这两个类的特性之后,起初我决定使用MediaRecorder类来解决录制暂停的问题,具体的思路如下:

      (1)每次触发开始录制和暂停录制音频的事件时都单独保存一个m4a格式的音频文件,直到最后触发停止录制音频的事件时,将之前录制的若干m4a格式的音频文件合并成一个文件。如图下:




      这种方法比较好理解,也容易想到,不过在实现过程中遇到了一个技术难点,那就是多个m4a格式的音频文件的合并并不是简单地将文件的内容拷贝到一个文件中,而是要通过分析每一个m4a格式的音频文件,计算出每个文件头的结构大小,并将文件头去掉,再将文件进行拷贝合并。通过查阅资料,发现m4a格式的音频文件头是由多个包含关系的ATOM结构组成,且每个不同的m4a格式的音频文件的文件头的大小都不一样,这样使得多个m4a文件头文件解析和合并变得较为复杂,若有多个m4a文件需要合并,那么会变得较为耗时。再者,对于没有足够音视频文件解析和编解码经验的开发者来讲,要精准地得解析一个m4a文件,挑战性太大(网上这方面的资料也寥寥无几),有兴趣的读者可以进行深入研究。

上述方法行不通,于是只好作罢,后来又想到了另外一种方法,也是我解决问题的最终方案,具体的思路如下:

     (2)由于使用AudioRecord类提供的方法录制的音频是原始的PCM格式的二进制数据,该格式的文件没有文件头信息,那么我们在进行文件合并时就就无需解析文件结构去掉对应的文件头,这样就变成了二进制数据地简单拷贝和合并。我在这里实现的方式是在录制音频的过程中采用边录制边写入的方式不断地向同一个文件写入录制的二进制音频数据。当触发暂停录音事件时,停止录制停止写入二进制数据,当触发继续录音事件时,则继续录制和向文件中写入数据。最后停止写入数据时,将PCM二进制音频文件编码成m4a格式的音频文件。如图下:


评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值