mp3lame linux 编译,ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5
1、環(huán)境和軟件版本
ubantu-16.4.1
ndk-r14b
ffmpeg-4.0.2
lame_mp3-3.99.5
2、廢話(huà)
因?yàn)槲乙彩切率?#xff0c;對(duì)linux不熟悉,對(duì)編譯不熟悉,最喜歡的動(dòng)作就是拿來(lái)主義,研究不深,所以不敢保證本文所有的操作都是一步到位沒(méi)有問(wèn)題,再者,即使跑不通,也可以給大家提供個(gè)思路。
根據(jù)我上一篇博客(https://my.oschina.net/u/1462828/blog/1860847)的編譯步驟,已經(jīng)可以編譯出來(lái)Android平臺(tái)運(yùn)行的so文件了,但是還存在的問(wèn)題就是,因?yàn)榘鏅?quán)問(wèn)題,所以ffmpeg是不包含MP3的編碼器的,所以我們只能是自己再編譯一個(gè)lamemp3到ffmpeg里面。
我們可以先嘗試編譯一個(gè)ubantu下可以直接運(yùn)行的ffmpeg帶MP3的,很簡(jiǎn)單。首先安裝lamemp3(ubantu命令:sudo apt-get install libmp3lame-dev),然后下載ffmpeg源碼并解壓,然后cd到源碼目錄,運(yùn)行ubantu命令三部曲:
1:./configure --enable-libmp3lame
2:make
3:make install
完了之后可以直接運(yùn)行ffmpeg -version,就可以看到ffmpeg的版本信息了,然后再找個(gè)音樂(lè),測(cè)試一下命令:ffmpeg -i 1.wav 2.mp3
命令如果運(yùn)行成功,成功的生成了2.MP3,那就證明MP3編碼器已經(jīng)集成成功了。
然后,就這么簡(jiǎn)單?
顯然,不可能這么簡(jiǎn)單,如果這么簡(jiǎn)單的話(huà),我也不用專(zhuān)門(mén)寫(xiě)個(gè)帖子了。
我用上一篇博客編譯的腳本,加上了--enable-libmp3lame 這一句,然后運(yùn)行編譯,一直在報(bào)錯(cuò):
找到ffbuild/config.log之后,天書(shū)……不懂的情況下生啃日志,總是一件讓人感到禿頂?shù)氖虑椤?/p>
最后字里行間,找到了一些蛛絲馬跡:
于是乎,初步懷疑是ffmpeg沒(méi)有定位到安裝的lameMP3目錄的原因,于是乎各種百度,找到的都是“apt-get install libmp3lame-dev”這句,很顯然這樣是不行的,至于原因后面會(huì)說(shuō)。
之后,各種騷操作都來(lái)了一波,外加中間絕望得放下了鍵盤(pán),拿起手機(jī)打了幾把吃雞游戲。
腦子清醒了之后再來(lái),終于定位到了問(wèn)題的關(guān)鍵所在:
-cflags是要定位到include目錄,前面加-I(大寫(xiě)i),ldflags是要定位到lib目錄,前面加-L
理論上是這樣,但是我換了七七四四九種打開(kāi)的方式和九九八十一個(gè)運(yùn)行命令的姿勢(shì),均換回來(lái)了一句冷冰冰的:
ERROR: libmp3lame >= 3.98.3 not found
無(wú)奈,網(wǎng)上的帖子也基本上都是h264+aac的,搞直播的那幫人都不用mp3了,于是只能是找了個(gè)ffmpeg的群,群里也不是很活躍,索性還是有大神常駐的,大神雖然沒(méi)有提供到最直接的幫助,但是也給了一個(gè)思路,就是用用ndk編譯lamemp3。
意思是,既然用的ndk編譯ffmpeg,是不是需要導(dǎo)入的lame也是需要用ndk來(lái)編譯。
說(shuō)剛就剛……但是,這個(gè)怎么用ndk編譯lamemp3?直接套用ffmpeg的那個(gè)腳本好像也不行,路徑上都沒(méi)有crpss-prefix等標(biāo)簽。
那就百度吧,沒(méi)辦法的事情,找了好久也沒(méi)有頭緒,后來(lái)靈光一閃,ffmpeg+h264+aac不也是一樣的道理么?于是乎找了一個(gè)帖子,然后把編譯aac的腳本搞了下來(lái),魔改了一番,經(jīng)過(guò)了七七四十九種打開(kāi)方式和九九八十一個(gè)不同姿勢(shì),終于編譯成功了。
然后在改了一下ffmpeg的-cflags標(biāo)簽,心中無(wú)限的憧憬和希望,感覺(jué)世界充滿(mǎn)了友愛(ài)與和諧,唯獨(dú)比較刺眼的就是那句紅色的,冷冰冰的代碼:
……
再檢查了一下過(guò)程,原來(lái)是cflags、ldflags的路徑少了一層,虛驚一場(chǎng)。
編譯完成后,拷貝so包出來(lái),米6真機(jī)測(cè)試,沒(méi)問(wèn)題。
果然,世界還是友愛(ài)的,和諧的。
3、編譯過(guò)程
1、源碼下載
lamemp3:http://lame.sourceforge.net/download.php
ffmpeg:http://ffmpeg.org/
切記在ubantu環(huán)境下下載,我這邊的軟件解壓目錄為:
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以上的。最開(kāi)始的時(shí)候安裝和下載的是3.100,顯示已經(jīng)是最新版本了,這個(gè)最新版本是3.1為何ffmpeg那邊是要3.9,后來(lái)網(wǎng)上找了一下,下載了個(gè)3.99.5的,現(xiàn)在回過(guò)頭一看,這他媽,哪門(mén)子3.1,分明是三點(diǎn)一百……
2、編譯lamemp3
下載,解壓,略……
然后是執(zhí)行編譯的腳本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
編譯完成后,會(huì)在lame-3.99.5目錄下看到一個(gè)android/armv7-a的目錄
里面就是我們需要的東西。
2、編譯ffmpeg
build.sh腳本與上一篇博客的基本一致,只是加上了一句--enbale-libmp3lame 和修改了cflags、ldfags標(biāo)簽
#!/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
老規(guī)矩,cd到ffmpeg-4.0.2目錄
chmod +x build.sh
./build.sh
make
make install
完成之后會(huì)在ffmpeg-4.0.2目錄下找到一個(gè)android/armv7-a目錄
到這里,就大功告成了,自己動(dòng)手吧,編譯好的我就不發(fā)出來(lái)了。
總結(jié)
以上是生活随笔為你收集整理的mp3lame linux 编译,ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如果物联网平台一直不盈利,行业集体该怎么
- 下一篇: linux 其他常用命令