ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5
2019獨角獸企業重金招聘Python工程師標準>>>
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-toolsARM_INC=$SYSROOT/usr/include ARM_LIB=$SYSROOT/usr/libLDFLAGS=" -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目錄
????
? ? 到這里,就大功告成了,自己動手吧,編譯好的我就不發出來了。
?
轉載于:https://my.oschina.net/u/1462828/blog/1862533
總結
以上是生活随笔為你收集整理的ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微信】微信小程序 应用内的页面跳转在添
- 下一篇: Kotlin 1.2 新特性