作者:谭东

时间:2017年9月24日

环境:Windows 7

Lame版本:Lame 3.99.5

LAME是目前最好的MP3编码引擎。LAME编码出来的MP3音色纯厚、空间宽广、低音清晰、细节表现良好,它独创的心理音响模型技术保证了CD音频还原的真实性,配合VBR和ABR参数,音质几乎可以媲美CD音频,但文件体积却非常小。对于一个免费引擎,LAME的优势不言而喻。

如果你需要将音频转码为mp3,就需要借助lame库。因为FFmpeg并不支持编码mp3。

因为ffmpeg自身也不支持转码Mp3,也是借助lame库实现的。

首先在官网http://lame.sourceforge.net/ 下载最新版的版本 lame-3.99.5 下载完进行解压,然后把libmp3lame目录下的文件拷贝到jni下面,去除i386文件夹,和非.c .h的文件,拷贝 lame.h (include目录下)到jni目录下。

编辑 jni/utils.h,把extern ieee754_float32_t fast_log2(ieee754_float32_t x);替换为extern float fast_log2(float x)。

ok,基本源码准备工作就做好了。

在Android上的编译如何新建项目等去我的前几篇文章看即可。

大致结构:

编写配置CMakeLists.txt

# For more information about using CMake with Android Studio, read the

# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC

# or SHARED, and provides the relative paths to its source code.

# You can define multiple libraries, and CMake builds them for you.

# Gradle automatically packages shared libraries with your APK.

add_library( lame

SHARED

libs/include/liblame/bitstream.c

libs/include/liblame/encoder.c

libs/include/liblame/fft.c

libs/include/liblame/gain_analysis.c

libs/include/liblame/id3tag.c

libs/include/liblame/lame.c

libs/include/liblame/mpglib_interface.c

libs/include/liblame/newmdct.c

libs/include/liblame/presets.c

libs/include/liblame/psymodel.c

libs/include/liblame/quantize.c

libs/include/liblame/quantize_pvt.c

libs/include/liblame/reservoir.c

libs/include/liblame/set_get.c

libs/include/liblame/tables.c

libs/include/liblame/takehiro.c

libs/include/liblame/util.c

libs/include/liblame/vbrquantize.c

libs/include/liblame/VbrTag.c

libs/include/liblame/version.c

libs/include/liblame/xmm_quantize_sub.c)

add_library( # Sets the name of the library.

native-lib

# Sets the library as a shared library.

SHARED

# Provides a relative path to your source file(s).

src/main/cpp/native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a

# variable. Because CMake includes system libraries in the search path by

# default, you only need to specify the name of the public NDK library

# you want to add. CMake verifies that the library exists before

# completing its build.

find_library( # Sets the name of the path variable.

log-lib

# Specifies the name of the NDK library that

# you want CMake to locate.

log )

set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in this

# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.

native-lib

lame

# Links the target library to the log library

# included in the NDK.

${log-lib} )

build.gradle里加入:

externalNativeBuild {

cmake {

cFlags "-DSTDC_HEADERS"

cppFlags ""

}

}是为了编译64位so库是防止出现

undefined symbol bcopy 这个错误的。

在新建的jni的native-lib.cpp里编写测试获取lame版本的方法:

#include

#include

#include "../../../libs/include/liblame/lame.h"

extern "C" {

JNIEXPORT jstring JNICALL

Java_com_tandong_lame_MainActivity_stringFromJNI(

JNIEnv *env,

jobject /* this */) {

std::string hello = "Hello from C++";

return env->NewStringUTF(hello.c_str());

}

JNIEXPORT jstring JNICALL

Java_com_tandong_lame_MainActivity_stringFromJNI2(

JNIEnv *env,

jobject /* this */) {

return env->NewStringUTF(get_lame_version());

}

}

Activity里调用即可:

package com.tandong.lame;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// Example of a call to a native method

TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI2());

}

/**

* A native method that is implemented by the 'native-lib' native library,

* which is packaged with this application.

*/

public native String stringFromJNI();

public native String stringFromJNI2();

// Used to load the 'native-lib' library on application startup.

static {

System.loadLibrary("native-lib");

}

}

后面就可以继续添加转码为mp3的音频格式的方法了。

版权所有,尊重版权。

微信公众号:

lame编译 android,Android编译Lame的全平台so库方案2,并实现转码mp3相关推荐

  1. vb.net 局域网传文件_没网盘咋传输文件?全平台高效传输方案一网打尽!

    我们对文件传输,一直有很强的需求.五年前我们使用网盘互相传文件,到了今天网盘的方式不免有些落后.有的网盘还要经过注册.安装.上传下载等等步骤,一不小心文件还会损坏,最气人的是速度上不去啊有木有! 如果 ...

  2. 一个近乎完美的 Unity 全平台热更方案

    [公众号回复 "1024",免费领取程序员赚钱实操经验] 大家好,我是章鱼猫. 今天推荐的这个项目是「HybridCLR」,是一个特性完整.零成本.高性能.低内存的近乎完美的 Un ...

  3. Android 移动安全知识技术全解(加固技术、常规漏洞、Android 逆向......),移动安全问题不容忽视

    前言 您的设备是否处于遭受攻击.劫持或损害的风险中?毫无疑问.剑桥大学的研究人员发现,87% 的 Android 智能手机有至少一个严重漏洞,Zimperium Labs 在早些时候发现,黑客只需通过 ...

  4. 3行代码实现全平台多语言离线OCR文字识别,完全免费开源

    你想在全平台多语言,包括windows/linux/嵌入式设备等等所有设备上实现离线OCR吗?只要三行代码(核心代码). 代码如下: BPHANDLE Handle= BPOcrInit(szDetM ...

  5. 编译Android下可用的全平台FFmpeg(包含libx264与libfdk-aac)

    请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/74544879 源码或工具版本: ndk :r14 FFmpeg 版本: ...

  6. android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片

    图形图像实践 android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片 android全平台编译libpng并基于ANativeWindow加载PNG图片 概 ...

  7. android 编译 aac,android全平台编译ffmpeg以及x264与fdk-aac实践

    目录 编译环境 单独编译完整功能ffmpeg库 第一步:编写config.sh环境配置文件 #NDK路径 export ANDROID_NDK_ROOT=/home/byhook/android/an ...

  8. android mp3 编码,Android 如何采用Lame编码器编码mp3文件

    这篇文章会基于下面3个问题来展开讲解. 1.什么是Lame? 2.为什么采用Lame? 3.Lame在Android应用上如何使用? 一.什么是Lame LAME is a high quality ...

  9. android xposed 编译,Xposed修改特征编译

    注意make缓存问题, 修改了文件内容,没有及时生效!!!! de.robv.android.xposed 在outdir目录中新建java目录移入XposedBridge.jar 参考链接 1 Xp ...

  10. Android 反编译Apk提取XML文件

    Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...

最新文章

  1. 渗透测试中使用浏览器的正确姿势
  2. svn的merge使用例子
  3. Visual C# 编程操作Excel
  4. [设计模式]原型模式
  5. 详解k8s deployment的滚动更新
  6. PHP中用于精确计算的bcmath扩展
  7. nyoj--203--三国志(迪杰斯特拉+背包)
  8. 参数php_PHP多参数方法的重构
  9. 数据结构与算法python语言描述答案_《数据结构与算法Python语言描述》习题第二章第一题(python版)...
  10. 如何让你的ASO优化效果提升10倍?
  11. 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
  12. 极光推送指定用户推送_苹果推送iOS 12.1.4和macOS 10.14.3修复FaceTime 国内用户可酌情...
  13. 当年的好记星、诺亚舟都去哪了?
  14. C语言二维数组定义、赋值、按要求遍历操作、输出以及函数调用
  15. 保姆级教程,阿里云快速搭建个人网站
  16. PHP中常用的十个字符串函数
  17. linux windows 共享 smbd 部署
  18. python爬虫入门爬取lpl选手价值排行榜
  19. JavaScript.07.淘宝购物车案例
  20. 也许这30句话会帮到你

热门文章

  1. shopify抓单按时间总是少一些的解决
  2. 看《当幸福来敲门》观后感
  3. 将源码打包成deb软件包
  4. python数据可视化第三章图表辅助元素的定制
  5. C盘用户里的文件夹改名
  6. 苹果手机登录华为账号无法连接服务器,华为手机登录华为帐号时,显示“没法连接到服务器”是什么情况?...
  7. 如何利用云流送(Cloud Streaming)构造一个全三维、沉浸式的数字化虚拟景区
  8. 百度地图和百度导航冲突问题
  9. Word目录制作修改
  10. sklearn svm 调参_sklearn调参(验证曲线,可视化不同参数下交叉验证得分)