ubantu-16+ndk-r14b 編譯 ffmpeg-4.0.2+lame_mp3-3.99.5

一、環境和軟件版本

ubantu-16.4.1php

ndk-r14blinux

ffmpeg-4.0.2android

lame_mp3-3.99.5c++

二、廢話

    由於我也是新手,對linux不熟悉,對編譯不熟悉,最喜歡的動做就是拿來主義,研究不深,因此不敢保證本文全部的操做都是一步到位沒有問題,再者,即便跑不通,也能夠給你們提供個思路。bash

    根據我上一篇博客(https://my.oschina.net/u/1462828/blog/1860847)的編譯步驟,已經能夠編譯出來Android平臺運行的so文件了,可是還存在的問題就是,由於版權問題,因此ffmpeg是不包含MP3的編碼器的,因此咱們只能是本身再編譯一個lamemp3到ffmpeg裏面。ide

    咱們能夠先嚐試編譯一個ubantu下能夠直接運行的ffmpeg帶MP3的,很簡單。首先安裝lamemp3(ubantu命令:sudo apt-get install libmp3lame-dev),而後下載ffmpeg源碼並解壓,而後cd到源碼目錄,運行ubantu命令三部曲:測試

    1:./configure --enable-libmp3lameui

    2:makegoogle

    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真機測試,沒問題。

    果真,世界仍是友愛的,和諧的。

三、編譯過程

一、源碼下載

    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,分明是三點一百……

二、編譯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的目錄

    

    裏面就是咱們須要的東西。

二、編譯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目錄

    

    到這裏,就大功告成了,本身動手吧,編譯好的我就不發出來了。

相關文章
相關標籤/搜索