下载地址: LAME MP3 Encoder :: Site Map

当前最新版本是3.100源码下载后以源码方式直接引用。在工程中创建main/cpp文件夹,将源码中的libmp3lame文件夹和include文件夹下的所有.h/.c文件拷贝至cpp目录下。配置CmakeLists.txt文件。

在build.gradle中配置时需要添加CFLAG 编译时参数 STDC_HEADERS,否则会在编译期间报错

/cpp/lame/psymodel.c:2164: undefined reference to `bcopy'
CMakeFiles/lamer.dir/lame/quantize.c.o:/cpp/lame/quantize.c:1287: more undefined references to `bcopy' follow

因此额外添加:

externalNativeBuild {cmake {cFlags '-DSTDC_HEADERS'}
}

至此,LAME mp3编码库导入完成,可以开始编码开发工作。

整体分为四个阶段: 初始化,编码,刷新缓存,销毁。

1. 初始化

mLameClient = lame_init();
lame_set_in_samplerate(mLameClient, sample_rate);
lame_set_out_samplerate(mLameClient, sample_rate);
lame_set_num_channels(mLameClient, 1);
lame_set_brate(mLameClient, 32);
lame_set_quality(mLameClient, 7);
lame_init_params(mLameClient);
  • in_samplerate: 输入采样率,默认44100HZ, 应该使用AudioRecord时设置的采样率。
  • out_samplerate: 输出采样率,默认是0,LAME支持的输出频率有限包括:
*  MPEG1    32, 44.1,   48khz
*  MPEG2    16, 22.05,  24
*  MPEG2.5   8, 11.025, 12

MP3全称是MPEG-1 audio layer3

MPEG-1音频分为3层,分别是MPEG-1 Layer1/2/3,高层兼容低层,第三层协议被称为MPEG-1 Layer3,简称MP3,2017年MP3专利过期已无专利保护任何人都可使用,已经成为主流的音频压缩技术。压缩近10倍,适合网络传输。

因此这里输出频率定义为44100HZ即可。

  • num_channels: 输入流的声道数,最多支持2个声道,默认为2。根据AudioRecord采样时的设置即可,
  • brate: 在CBR模式下有效。bitrate与compress ratio功能相同,仅设置一个就行,compression默认的压缩率是11.025。
  • quality: 影响压缩算法,值范围为0-9, 0质量最好速度最慢,9质量最差速度最快。源码建议:3 near-best quality, not too slow; 5 good quality, fast; 7 ok quality, really fast。根据场景选择。
  • mode: 模式。立体声或者单声道。默认不设置和输入声道保持一致。
  • VBR:  默认是CBR。VBR是动态码率,适合于本地播放,根据编码内容的复杂程度动态的分配比特,因此输出质量比较高;CBR是静态码率,比特率在流处理过程中保持恒定一致,质量比变化比较明显;vbr_off代表设置为cbr,vbr_mrth代表设置为vbr。其他参数可见代码注释。

2. 编码

int lame_encode_buffer(lame_global_flags * gfp,const short int pcm_l[], const short int pcm_r[], const int nsamples,unsigned char *mp3buf, const int mp3buf_size)

pcm_l: 左声道数据,short数组

pcm_r: 右声道数据,short数组

nsmples: 数组长度,如果是单声道,即对应的short数组的长度

mp3Buf: 编码结果返回的数组,使用单字节长度容器装载。

mp3buf_size: 编码结果返回的数组长度,源码中有建议给出

mp3buffer_size in bytes = 1.25*num_samples + 7200。

3.刷新缓存

在编码结束之后,需要刷新编码器的缓冲到mp3文件中。

int
lame_encode_flush(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size)

 4.关闭

int
lame_close(lame_global_flags * gfp)

以上即LAME编码mp3的步骤。

我在项目中使用方式是边录边编码的方式,通过AudioRecord获取到PCM数据,立刻通知编码器进行编码输出到文件中。有两个重要的点:

1. 如何通知给编码器。 编码和录音运行在不同的线程中,如果编码时机不对会造成遗漏数据的问题,因此采用阻塞队列的方式,在录音线程开始前即启动编码线程,在编码线程中从阻塞队列中读取数据,如果没有数据则阻塞等待,录音线程获取到数据后给队列添加数据编码线程开始处理。即保证了处理的及时性,也没有耗费CPU资源。

2. 传递给LAME的PCM数据大小。有可能在录音阶段获取的是byte数组,需要专为short数组,此时可以使用ByteBuffer转换。在判断是大端序还是小端序时,调用ByteBuffer#nativeOrder即可。

Android使用LAME Mp3编码相关推荐

  1. Android使用LAME将pcm文件转mp3文件

    Android使用LAME将pcm格式转mp3格式 lame介绍:LAME是一款开源的MP3编码器,被认为是中高比特率和VBR的最佳MP3编码器,质量和速度方面的改进仍在继续,可能使LAME成为仍在积 ...

  2. android lame wav 转 mp3,Android JNI Lame编解码实现wav到MP3的转换

    1.JNI简介 JNI全称为Java Native Interface(JAVA本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

  3. Android使用lame将PCM文件转码为MP3文件

    Android使用lame将PCM文件转码为MP3文件 1. 软件版本 Android Studio版本:4.2 lame版本:3.100 编译参考:centos7使用ndk编译lame 2. 项目配 ...

  4. flash 版的mp3编码代码

    flash 版的mp3编码代码 Shine MP3 Encoder on Alchemy http://code.google.com/p/flash-kikko/ 简介 Shine简单轻量级的mp3 ...

  5. ffmpeg支持MP3编码的方法

    问题 近期一个项目中mp3文件较大,需要转成占用存储空间较小的文件.首先想到的是"格式工厂",非常便捷,但是此工具每次批量转换数量上限是1000,而我要转上万个.所以考虑用ffmp ...

  6. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)

    在写这篇文章之前,xxx已写过了几篇关于改音乐应用开发主题的文章,想要了解的朋友可以去翻一下之前的文章 Android应用开发--MP3音乐播放器界面计划(2) 2013年5月25日 简.美音乐播放器 ...

  7. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  8. Android应用开发--MP3音乐播放器界面设计(1)

    Android应用开发--MP3音乐播放器界面设计(1)                                           近期突然想自己开发一款MP3播放器,所以就有了上面的界面, ...

  9. android 播放器 wav 无法播放,对于Android媒体播放器mp3与wav(For android media player mp3 vs. wav)...

    对于Android媒体播放器mp3与wav(For android media player mp3 vs. wav) 我想知道在Android媒体播放器上加载和播放小wav是否比较快的小文件更快. ...

  10. Android应用开发--MP3音乐播放器Service实现

    Android应用开发--MP3音乐播放器Service实现 2013年5月29日简.美音乐播放器开发记录 让网友们久等啦,关于简.美音乐播放器的开发,最重要的Service类总算是要发博了.关于An ...

最新文章

  1. mysql管理用户数据库_MySQL 数据库管理(一)(用户与受权)
  2. R语言合并两个或多个有序数dataframe实战(dataframe的纵向合并):使用R原生方法、data.table、dplyr等方案
  3. C++ 虚拟析构函数
  4. C++Pascal‘s Triangle杨辉三角的实现算法
  5. 通过Erlang构建TCP服务器
  6. 【数据结构与算法】之判断字符是否唯一
  7. JavaScript 中 obj.hasOwnProperty(prop) 方法
  8. 文本相似度、文本匹配、文本聚类
  9. 如何用VS2005制作Web安装程序
  10. 组策略参考文档1-共享打印机
  11. 中小企业怎样转型做跨境电商独立站?
  12. 喜欢的数字:使用一个字典来_数字证书:何时何地使用它们
  13. mac显示网速_Mac系统怎么查看测试网速
  14. JAVA多线程之男朋友和女朋友之间的故事
  15. eeglab导出图片
  16. 关于绩效考核及绩效面谈
  17. 现在润新加坡是个好主意吗?
  18. 第二人生的源码分析(109)脚本的语法分析(3)
  19. 小学五年级如何引导学计算机,怎么教五年级小孩数学
  20. 车辆计数“FCN-rLSTM: Deep Spatio-Temporal Neural Networks for Vehicle Counting in City Cameras”

热门文章

  1. NVIDIA GeForce Experience登录报错:验证程序加载失败,请检查您的浏览器设置,例如广告拦截程序(解决办法)
  2. 【学习笔记】Baby Step Giant Step算法及其扩展
  3. unity怎么显示骨骼_Unity3D 骨骼动画原理学习笔记
  4. mysql查询姓名第二个字_第二篇:MySQL中SELECT查询语句总结
  5. 前端 2018 届校招笔试面经【百度,阿里,腾讯,阿里文娱,携程,美团,拼多多】...
  6. 类似携程,飞猪机票列表滚动的日期带价格
  7. hive执行insert overwrite失败,报错 could notbe cleaned up错误
  8. 2021年7月20日我国暴雨趋势遥感监测与评估
  9. Unity Hex与Color之间进行颜色转换
  10. 想查看实时卫星影像?最近一周就不错了