android实现MP3音频录制(lame,支持暂停)

前言部分

最近公司项目在做一个录音功能,主要就是实现一个简单的录音机的模块,模块中主要需要几点:

  1. 支持暂停录音
  2. 支持录制MP3格式音频
  3. 定制录制的进度条

如上需求我们具体分如何开始着手分析需要解决的问题,

  1. 如何支持暂停?android本身支持暂停的api是在新版本上才加入的(api24),系统的api不能满足我们的需求,所以要走其他的道路,通过拼接多个音频文件来完成暂停功能。

    这里简单了解一下android的支持的音频格式aac,amr。每个格式都有固定的文件格式。如:arm只有文件的前6个字节是文件头,我们只需要去除这个文件头拼接就可以了。

  2. 如上android支持的格式都不很友好,不能满足后台的需求,后台需要我们录制MP3格式的音频文件。我是通过大家熟悉lameMP3转码库实现,这里lame需要自己编译,网上例子比较多。我们录制完成的MP3文件,在通过对文件完成拼接同样实现暂停效果。
  3. 一个定制的环形进度条,涉及到简单自定义view的知识,不多介绍。
    Git地址
    效果图如下:
    android实现MP3音频录制(lame,支持暂停)_第1张图片

内容部分

录制音频文件我们可以通过两种方式来实现,分别是MediaRecorder和AudioRecord,这两种区别主要还是封装的程度不一样。MediaRecorder返回转码后的文件,AudioRecord能够拿到原始的PCM数据,这里你可以做很多的声音特效(变音)。网上文章比较多,请自行查看哈。

接下来我们要做的事情:使用AudioRecord进行录制,把原始的pcm文件通过lame的库进行转码,然后在把多个MP3文件链接起来,我们的需求就实现了。

开始第一部分内容,通过ndk对lame库编码生成so库。

使用了其他人的库,自己进行了编译。
库地址

  1. 首先我们需要把配置好ndk的相关内容,如安装,配置环境变量,这里不多介绍了,多数都是配置好的了。
  2. 修改里面的文件,这里需要注意把包名换成自己的包名,图片如下::android实现MP3音频录制(lame,支持暂停)_第2张图片
  3. 然后进入jni目录下,通过ndk-build来编译so库
  4. 会在jni的上级目录创建libs文件夹,生成我们的需要不同CPU架构的so库文件

这里在把生成的so库应用到项目的时候,出了一点小问题。记录如下:

我把生成的so库直接引入到项目中,发现不能打包到apk中,没有找到原因。这里可能是因为so的引入方式不对导致,也可能是因为我在java层有和so库相对应的方法有关。我的引入方式为,在main文件夹下(java同级目录),添加jniLibs文件夹,并把so库放到该目录下。

解决方案是单独创建了android的lib,然后把重新编译了so文件,放到该module下面。在应用中引入新建的android lib成功导入。

然后把生成的MP3文件进行合并,方法和合并arm文件类似,不过MP3文件的格式更复杂一些。

主要需要先把MP3文件进行分离,去掉头文件和尾文件。然后进行拼接就可以。这里使用了网上流传广泛的一个工具类实现(原地址我找不到了)。
代码如下:
传送门

结尾部分

android 音频相关内容比较多,有机会考虑在深入学习吧。

这里主要的知识点:

  • 通过android提供的api录制一段音频
  • 通过文件合成,完成api不提供的录音暂停功能
  • 使用音频转码库lame,将原始音频数据转化为MP3类型文件

你可能感兴趣的:(乱八七糟)