ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5

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/

    ndk:https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip 

    切记在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目录

    

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

猜你喜欢

转载自blog.csdn.net/jiabailong/article/details/105229805