这篇文章会基于上面 3 个问题来开展解说。
1、什么是 Lame?
2、为什么采纳 Lame?
3、Lame 在 Android 利用上如何应用?
一、什么是 Lame
咱们看下 Lame 官网(https://lame.sourceforge.io/index.php)给的形容
LAME is a high quality MPEG Audio Layer III (MP3) encoder licensed under the LGPL.
翻译成中文就是:LAME 是一个高质量的 MPEG 音频层 III (MP3) 编码器,在 LGPL 下受权 。
好了,当初咱们晓得 Lame 就是个开源的编码器,而且是专门用来编码 mp3 文件的。
二、为什么要采纳 Lame
在 Android 上开发过录音性能的同学应该晓得,在 Android 上要实现录音性能,有 2 种形式。一种是采纳 AudioRecord 的形式,AudioRecord 录制的间接是原始的 pcm 数据,另一种形式就是采纳 MediaRecord,能够录制相似 amr、aac 格局的文件。
这里贴下 MediaRecord 目前反对的录音格局,能够看到目前是不反对 mp3 的。那这时咱们想要编码 mp3 的文件,就得借助 lame 来实现了。
public final class AudioEncoder {
/* Do not change these values without updating their counterparts
* in include/media/mediarecorder.h!
*/
private AudioEncoder() {}
public static final int DEFAULT = 0;
/** AMR (Narrowband) audio codec */
public static final int AMR_NB = 1;
/** AMR (Wideband) audio codec */
public static final int AMR_WB = 2;
/** AAC Low Complexity (AAC-LC) audio codec */
public static final int AAC = 3;
/** High Efficiency AAC (HE-AAC) audio codec */
public static final int HE_AAC = 4;
/** Enhanced Low Delay AAC (AAC-ELD) audio codec */
public static final int AAC_ELD = 5;
/** Ogg Vorbis audio codec */
public static final int VORBIS = 6;
/** @hide EVRC audio codec */
public static final int EVRC = 10;
/** @hide QCELP audio codec */
public static final int QCELP = 11;
/** @hide Linear PCM audio codec */
public static final int LPCM = 12;
}
三、Lame 在 Android 利用上如何应用
在 android 上集成开源的代码,很多时候套路都差不多,就是下载源码,编译出相干的 so 库,而后就是调用这些库提供的办法了,当然,调用 so 库外面的办法,利用上须要借助 jni 来实现。
这里就不介绍如何下载 lame 源码和编码 so 库了。编译 lame 源码后,咱们会失去一个 libmp3lame.so 的库文件,调用这个 so 库外面的办法,还须要咱们去实现 JNI 局部的代码。
整体的思路就是,应用层通过调用 JNI 提供的 native 办法,而后调用到 libmp3lame.so 库外面的办法,实现编码 mp3 文件。
这里给出的一个例子是将 pcm 格局的文件编码 mp3 格局的文件。
代码 git 地址:https://github.com/yorkZJC/AndroidLameEncodeMp3Demo.git
代码逻辑这里简略讲下:
LameEncodeJniNative.java 是本地封装的 native 办法,为应用层提供了 2 个办法,一个是编码,一个是完结。这 2 个办法对应 c ++ 层具体的实现,能够看工程 cpp/ 目录下文件的实现,cpp 文件外面的实现也比较简单。
利用代码调用的时候,就是传入对应的 pcm 源文件和须要生成的 mp3 文件门路,还有 pcm 源文件的格局信息(采用率、通道数、编码数据位数)。
File pcmFile = new File(getExternalFilesDir(null), "input.pcm");
File mp3File = new File(getExternalFilesDir(null), "output.mp3");
mLameEncoder = new LameEncodeJniNative();
mLameEncoder.encode(pcmFile.getAbsolutePath(), mp3File.getAbsolutePath(), 44100, 2, 128);
自己从事 Android Camera 相干开发已有 5 年
目前在深圳下班
欢送大家关注我的微信公众号“小驰笔记”
大家一起学习交换