lame编译 android,Android编译Lame的全平台so库方案2,并实现转码mp3
作者:谭东
时间: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相关推荐
- vb.net 局域网传文件_没网盘咋传输文件?全平台高效传输方案一网打尽!
我们对文件传输,一直有很强的需求.五年前我们使用网盘互相传文件,到了今天网盘的方式不免有些落后.有的网盘还要经过注册.安装.上传下载等等步骤,一不小心文件还会损坏,最气人的是速度上不去啊有木有! 如果 ...
- 一个近乎完美的 Unity 全平台热更方案
[公众号回复 "1024",免费领取程序员赚钱实操经验] 大家好,我是章鱼猫. 今天推荐的这个项目是「HybridCLR」,是一个特性完整.零成本.高性能.低内存的近乎完美的 Un ...
- Android 移动安全知识技术全解(加固技术、常规漏洞、Android 逆向......),移动安全问题不容忽视
前言 您的设备是否处于遭受攻击.劫持或损害的风险中?毫无疑问.剑桥大学的研究人员发现,87% 的 Android 智能手机有至少一个严重漏洞,Zimperium Labs 在早些时候发现,黑客只需通过 ...
- 3行代码实现全平台多语言离线OCR文字识别,完全免费开源
你想在全平台多语言,包括windows/linux/嵌入式设备等等所有设备上实现离线OCR吗?只要三行代码(核心代码). 代码如下: BPHANDLE Handle= BPOcrInit(szDetM ...
- 编译Android下可用的全平台FFmpeg(包含libx264与libfdk-aac)
请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/74544879 源码或工具版本: ndk :r14 FFmpeg 版本: ...
- android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片
图形图像实践 android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片 android全平台编译libpng并基于ANativeWindow加载PNG图片 概 ...
- android 编译 aac,android全平台编译ffmpeg以及x264与fdk-aac实践
目录 编译环境 单独编译完整功能ffmpeg库 第一步:编写config.sh环境配置文件 #NDK路径 export ANDROID_NDK_ROOT=/home/byhook/android/an ...
- android mp3 编码,Android 如何采用Lame编码器编码mp3文件
这篇文章会基于下面3个问题来展开讲解. 1.什么是Lame? 2.为什么采用Lame? 3.Lame在Android应用上如何使用? 一.什么是Lame LAME is a high quality ...
- android xposed 编译,Xposed修改特征编译
注意make缓存问题, 修改了文件内容,没有及时生效!!!! de.robv.android.xposed 在outdir目录中新建java目录移入XposedBridge.jar 参考链接 1 Xp ...
- Android 反编译Apk提取XML文件
Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...
最新文章
- 渗透测试中使用浏览器的正确姿势
- svn的merge使用例子
- Visual C# 编程操作Excel
- [设计模式]原型模式
- 详解k8s deployment的滚动更新
- PHP中用于精确计算的bcmath扩展
- nyoj--203--三国志(迪杰斯特拉+背包)
- 参数php_PHP多参数方法的重构
- 数据结构与算法python语言描述答案_《数据结构与算法Python语言描述》习题第二章第一题(python版)...
- 如何让你的ASO优化效果提升10倍?
- 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
- 极光推送指定用户推送_苹果推送iOS 12.1.4和macOS 10.14.3修复FaceTime 国内用户可酌情...
- 当年的好记星、诺亚舟都去哪了?
- C语言二维数组定义、赋值、按要求遍历操作、输出以及函数调用
- 保姆级教程,阿里云快速搭建个人网站
- PHP中常用的十个字符串函数
- linux windows 共享 smbd 部署
- python爬虫入门爬取lpl选手价值排行榜
- JavaScript.07.淘宝购物车案例
- 也许这30句话会帮到你
热门文章
- shopify抓单按时间总是少一些的解决
- 看《当幸福来敲门》观后感
- 将源码打包成deb软件包
- python数据可视化第三章图表辅助元素的定制
- C盘用户里的文件夹改名
- 苹果手机登录华为账号无法连接服务器,华为手机登录华为帐号时,显示“没法连接到服务器”是什么情况?...
- 如何利用云流送(Cloud Streaming)构造一个全三维、沉浸式的数字化虚拟景区
- 百度地图和百度导航冲突问题
- Word目录制作修改
- sklearn svm 调参_sklearn调参(验证曲线,可视化不同参数下交叉验证得分)