1、环境和软件版本

ubantu-16.4.1

ndk-r14b

ffmpeg-4.0.2

lame_mp3-3.99.5

2、废话

因为我也是新手,对linux不熟悉,对编译不熟悉,最喜欢的动作就是拿来主义,研究不深,所以不敢保证本文所有的操作都是一步到位没有问题,再者,即使跑不通,也可以给大家提供个思路。

根据我上一篇博客(https://my.oschina.net/u/1462828/blog/1860847)的编译步骤,已经可以编译出来Android平台运行的so文件了,但是还存在的问题就是,因为版权问题,所以ffmpeg是不包含MP3的编码器的,所以我们只能是自己再编译一个lamemp3到ffmpeg里面。

我们可以先尝试编译一个ubantu下可以直接运行的ffmpeg带MP3的,很简单。首先安装lamemp3(ubantu命令:sudo apt-get install libmp3lame-dev),然后下载ffmpeg源码并解压,然后cd到源码目录,运行ubantu命令三部曲:

1:./configure --enable-libmp3lame

2:make

3:make install

完了之后可以直接运行ffmpeg -version,就可以看到ffmpeg的版本信息了,然后再找个音乐,测试一下命令:ffmpeg -i 1.wav 2.mp3

命令如果运行成功,成功的生成了2.MP3,那就证明MP3编码器已经集成成功了。

然后,就这么简单?

显然,不可能这么简单,如果这么简单的话,我也不用专门写个帖子了。

我用上一篇博客编译的脚本,加上了--enable-libmp3lame 这一句,然后运行编译,一直在报错:

找到ffbuild/config.log之后,天书……不懂的情况下生啃日志,总是一件让人感到秃顶的事情……

最后字里行间,找到了一些蛛丝马迹:

于是乎,初步怀疑是ffmpeg没有定位到安装的lameMP3目录的原因,于是乎各种百度,找到的都是“apt-get install libmp3lame-dev”这句,很显然这样是不行的,至于原因后面会说。

之后,各种骚操作都来了一波,外加中间绝望得放下了键盘,拿起手机打了几把吃鸡游戏。

脑子清醒了之后再来,终于定位到了问题的关键所在:

-cflags是要定位到include目录,前面加-I(大写i),ldflags是要定位到lib目录,前面加-L

理论上是这样,但是我换了七七四四九种打开的方式和九九八十一个运行命令的姿势,均换回来了一句冷冰冰的:

ERROR: libmp3lame >= 3.98.3 not found

无奈,网上的帖子也基本上都是h264+aac的,搞直播的那帮人都不用mp3了,于是只能是找了个ffmpeg的群,群里也不是很活跃,索性还是有大神常驻的,大神虽然没有提供到最直接的帮助,但是也给了一个思路,就是用用ndk编译lamemp3。

意思是,既然用的ndk编译ffmpeg,是不是需要导入的lame也是需要用ndk来编译。

说刚就刚……但是,这个怎么用ndk编译lamemp3?直接套用ffmpeg的那个脚本好像也不行,路径上都没有crpss-prefix等标签。

那就百度吧,没办法的事情,找了好久也没有头绪,后来灵光一闪,ffmpeg+h264+aac不也是一样的道理么?于是乎找了一个帖子,然后把编译aac的脚本搞了下来,魔改了一番,经过了七七四十九种打开方式和九九八十一个不同姿势,终于编译成功了。

然后在改了一下ffmpeg的-cflags标签,心中无限的憧憬和希望,感觉世界充满了友爱与和谐,唯独比较刺眼的就是那句红色的,冷冰冰的代码:

……

再检查了一下过程,原来是cflags、ldflags的路径少了一层,虚惊一场。

编译完成后,拷贝so包出来,米6真机测试,没问题。

果然,世界还是友爱的,和谐的。

3、编译过程

1、源码下载

lamemp3:http://lame.sourceforge.net/download.php

ffmpeg:http://ffmpeg.org/

切记在ubantu环境下下载,我这边的软件解压目录为:

lamemp3:    /home/xiaoyu/lame-3.99.5

ndk:    /home/xiaoyu/ndk

ffmpeg:    /home/xiaoyu/ffmpeg/ffmpeg-4.2.0/

还是忍不住吐槽一下lame的版本命名,最新版本是3.100,上一版是3.99.5,然后ffmpeg支持的是3.98.3以上的。最开始的时候安装和下载的是3.100,显示已经是最新版本了,这个最新版本是3.1为何ffmpeg那边是要3.9,后来网上找了一下,下载了个3.99.5的,现在回过头一看,这他妈,哪门子3.1,分明是三点一百……

2、编译lamemp3

下载,解压,略……

然后是执行编译的脚本build.sh

#!/bin/bash

NDK_HOME=/home/xiaoyu/ndk/android-ndk-r14b

ANDROID_API=android-21

SYSROOT=$NDK_HOME/platforms/$ANDROID_API/arch-arm

ANDROID_BIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/

CROSS_COMPILE=${ANDROID_BIN}/arm-linux-androideabi-

export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

ARM_INC=$SYSROOT/usr/include

ARM_LIB=$SYSROOT/usr/lib

LDFLAGS=" -nostdlib -Bdynamic -Wl,--whole-archive -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$NDK_HOME/sources/cxx-stl/gnu-libstdc++/libs/armeabi -L$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/arm-linux-androideabi/lib -L$ARM_LIB -lc -lgcc -lm -ldl "

FLAGS="--host=arm-linux --enable-static --disable-shared"

export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"

export LDFLAGS="$LDFLAGS"

export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"

CPU=armv7-a

./configure $FLAGS \

--prefix=$(pwd)/android/$CPU

cd到lame-3.99.5目录

chmod +x build.sh

./build.sh

make

make install

编译完成后,会在lame-3.99.5目录下看到一个android/armv7-a的目录

里面就是我们需要的东西。

2、编译ffmpeg

build.sh脚本与上一篇博客的基本一致,只是加上了一句--enbale-libmp3lame 和修改了cflags、ldfags标签

#!/bin/bash

NDK=/home/xiaoyu/ndk/android-ndk-r14b

SYSROOT=$NDK/platforms/android-21/arch-arm/

CPU=armv7-a

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

PREFIX=$(pwd)/android/$CPU

ADDI_CFLAGS="-marm"

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

function build_android

{

./configure \

--prefix=$PREFIX \

--enable-neon \

--enable-hwaccels \

--enable-shared \

--enable-libmp3lame \

--enable-jni \

--enable-mediacodec \

--enable-decoder=h264_mediacodec \

--disable-static \

--disable-doc \

--enable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--enable-avdevice \

--disable-doc \

--disable-symver \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--target-os=android \

--arch=arm \

--cpu=armv7-a \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

}

ADDI_CFLAGS="-I/home/xiaoyu/lame/include"

ADDI_LDFLAGS="-L/home/xiaoyu/llame/lib"

build_android

老规矩,cd到ffmpeg-4.0.2目录

chmod +x build.sh

./build.sh

make

make install

完成之后会在ffmpeg-4.0.2目录下找到一个android/armv7-a目录

到这里,就大功告成了,自己动手吧,编译好的我就不发出来了。

mp3lame linux 编译,ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5相关推荐

  1. 最新的ndkr20编译c_使用NDK(r20)编译FFmpeg

    前两天在论坛上看到一个问题,大意是怎么在UBUNTU下使用NDK-r20编译FFmpeg.我第一反应是不该用r20,因为我在很早前用过没有gcc版本的NDK,发现有很多问题不能编译,就立马回复了个使用 ...

  2. Linux环境下用NDK编译FFmpeg

    一.下载NDK和FFmpeg NDK和FFmpeg的版本需要对应起来,否则编译过程中可能失败. 这里采用的版本为android-ndk-r15c-linux-x86_64.zip和ffmpeg-4.0 ...

  3. cmake linux编译,Ubuntu 16.04编译cmake源码

    编译版本:cmake-3.8.0-rc2 为了能够在Ubuntu 16.04中编译出ccmake和cmake-gui,首先需要安装libncurses5-dev sudo apt install li ...

  4. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

  5. 安卓和Linux动态库一样吗,在Linux环境下编译Android下的最新版ffmpeg+x264单个动态库(.so)...

    最近在mac下用ndk交叉编译最ffmpeg出问题,总是显示用系统的gcc而不是ndk的toolchain的交叉编译gcc来编译的.之前明明没问题的,可能是由于最近升级macOS导致的.由于对这方面实 ...

  6. 最新版FFmpeg移植Android:编译so库(基于NDK r20和FFmpeg-4.1.0)

    FFmpeg是非常强大的编解码库,支持相当多的格式.如果你仔细看一下手机中各种播放器的许可条款,一定不会缺少FFmpeg的身影. 但是网络上FFmpeg移植的资料都非常少,很多还是使用很老的库,比如使 ...

  7. 瞎折腾-CentOS 7.4 编译4.16.2版kernel 并安装

    CentOS 7.4下 原内核版本: 3.10.0-693.el7.x86_64 改后内核版本: 4.16.2 系统版本: CentOS-7-x86_64-Minimal-1708.iso 运行环境: ...

  8. 在Eclipse中配置NDK自动编译环境builders

    对于NDK的编译,切换到目标目录下,运行ndk-build脚本即可. 对于使用Eclipse开发,我们希望EC能自动的编译我们的NDK,那么只需要为工程添加一个Builders即可. 对于Window ...

  9. Linux编辑firmware的文件,rk3328编译Linux固件

    一.编译 Linux 固件 这一章将介绍编译 ROC-RK3328-CC Linux 固件的整个流程. 1.1 准备工作 Linux 固件在如下的环境中编译: Ubuntu 16.04 amd64 安 ...

  10. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核

    ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...

最新文章

  1. 面试:InnoDB 中一棵 B+ 树可以存放多少行数据?
  2. git checkout 命令详解
  3. lucene 增加相关性_事务性Lucene
  4. 《学C编程也可以卡通一点》一1.7变量的类型
  5. 19岁黑客找到暴露 Facebook 页面管理员的缺陷,获4500美元奖励
  6. 马来西亚 IT 决策者正转向开源来最大化 IT 功能
  7. dell inspiron 只有一个飞行模式 没有wifi_【显示器推荐③】2K常规显示器|显示器|电脑|hdr|dell|hdmi...
  8. 4.Scala-数据结构
  9. 软件界面是怎么做出来的_可可英语这个软件怎么样?了解的人出来说说真实情况...
  10. noi linux,NOI Linux使用教程(基础讲解)
  11. kingbase 数据库初始化失败
  12. 机器学习 k-近邻算法
  13. xxxxxlllllxl的专栏 链接,很多实际动手操作的东西
  14. 用SAXReader解析xml文档
  15. 运维36讲第07课:基于 Django_crontab、Xadmin 做一套定时任务管理系统
  16. 解读VL162最新Switshi切换芯片是VIA最新推出的Switsh芯片USB 3.1 Type-C接口数据切换开关专用芯片
  17. 判断两个日期间隔是否为7日内
  18. 微信小程序点击地址,跳转到地图导航
  19. 十岁不愁、二十不悔、三十而立、四十不惑、五十知天命、六十耳顺、七十古来稀...
  20. 数字调制解调—MSK

热门文章

  1. 2013校园招聘阶段小结
  2. 爬虫学习之17:爬取拉勾网网招聘信息(异步加载+Cookie模拟登陆)
  3. 【云原生Kubernetes系列第二篇】Kubernetes(k8s)核心组件(对的人兜兜转转最后还是会遇见)
  4. 第一次滑雪经过——教你如何省钱
  5. 新元宇宙奇科幻小说原创作品每周连载地球人奇游天球记第七回月球背面
  6. 齿轮仿真软件ROMAX DESIGNER安装教程
  7. 阿里腾讯裁员、最高30%?计算机行业前景到底如何...
  8. 给仍在「 选品 」的跨境卖家提个醒!
  9. opencv-视频处理--画感兴趣区域(ROI)
  10. chromium下载历史版本错误