編譯FFmpeg源文件并在Android Studio中使用的簡(jiǎn)單例子

挖個(gè)坑。等我踩完這個(gè)系列的坑來(lái)再來(lái)填。先粗略寫下。

編譯環(huán)境:win7+Android Studio

————————————

具體實(shí)現(xiàn):在Android Studio下使用FFmpeg的最簡(jiǎn)單輸出Hello Wworld。

這里需要用到NDK,目前還無(wú)法熟練使用,因此記錄下來(lái)。



首先,我們需要下載FFmpeg源碼。

下載地址:http://ffmpeg.org/download.html

然后下載:MinGW。

下載完畢后MinGW需要安裝。安裝時(shí)其實(shí)先裝的是個(gè)下載管理器,到選擇安裝選項(xiàng)的時(shí)候要選上msys-base和mingw32-gcc-ada兩項(xiàng)。


選擇[Installation] - [Apply Changes],安裝

成功安裝后如下圖。


然后添加環(huán)境變量。


運(yùn)行D:\MinGW\msys\1.0目錄下的msys.bat,cd到ffmpeg目錄執(zhí)行build_android.sh

msys.bat類似于Windows中的cmd。



復(fù)制粘貼的命令可以參考此鏈接:

https://segmentfault.com/q/1010000002898504

使用shift + insert應(yīng)該是可以粘貼的,至于復(fù)制,應(yīng)該可以配置為選中即復(fù)制。

不知道為什么無(wú)法編譯成功,可能是因?yàn)橹板e(cuò)誤地進(jìn)行了編譯,改變了源文件,因此我再重新試試。


編寫build_android.sh腳本文件,如果從網(wǎng)上直接copy過去可能會(huì)是dos格式,使用dos2unix build_android.sh 轉(zhuǎn)換一下,刪掉多余空格。(出處:http://www.cnblogs.com/blogs-of-lxl/p/6252130.html?utm_source=itdadao&utm_medium=referral)


結(jié)果認(rèn)真地修改了如圖所示處


后來(lái)發(fā)現(xiàn)之前的錯(cuò)誤原因在于build_android.sh中TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

這一句的路徑設(shè)置錯(cuò)誤了。因?yàn)榇a的出處編譯環(huán)境是Mac,而Mac跟Windows路徑是不一樣的,Mac環(huán)境下是darwin-x86_64,Windows是windows-x86_64。

重新執(zhí)行,結(jié)果依然是會(huì)報(bào)錯(cuò)的,比如出現(xiàn)command not found。

但是其實(shí)實(shí)際上已經(jīng)在生成so文件了。然后就需要漫長(zhǎng)的等待了。需要幾分鐘,去吃根雪糕冷靜下先。


最后成功生成一系列.h文件。


新建的ffmpegtemp目錄下會(huì)生成文件。

D:\ffmpeg\ffmpeg-3.3.3\ffmpegtemp

ffmpeg-3.3.3目錄下也會(huì)生成一個(gè)android文件。,這里面有so文件。

到這里為止,ffmpeg庫(kù)文件就編譯好啦~

可以被Android Studio使用啦~

下面開始使用Android Studio測(cè)試編譯好的SO庫(kù)。

創(chuàng)建工程,并新建 jni 目錄。

(這里新建普通的工程文件就好,不用勾選include C++,我第一次新建的時(shí)候新建錯(cuò)了,后來(lái)重新建立了一個(gè)工程文件那些才能正常運(yùn)行)。

Android Studio如何創(chuàng)建.mk文件

右鍵 新建-file 在輸入的時(shí)候加上.mk即可


雖然報(bào)錯(cuò),但是依舊成功生成頭文件。


運(yùn)行ndk-build(需配置NDK環(huán)境變量。em...配置好安卓SDK開發(fā)環(huán)境之后還需配置環(huán)境變量,配置NDK環(huán)境變量看這里

http://www.lxweimin.com/p/0099d0e5d3d7

http://www.lxweimin.com/p/708e6bf68ae9)。

測(cè)試是否成功配置方法,通過cmd進(jìn)入命令行,輸入ndk-build。

下圖為未配置情況。

下面進(jìn)行配置

這里可以看出NDK是已經(jīng)安裝好了的,但是并沒有配置環(huán)境。

首先下載NDK(雖然AS中安裝了NDK但是還是需要下載),下載地址:

https://developer.android.com/ndk/downloads/index.html


谷歌中國(guó)站雖然開通了,所以可以使用下面的這個(gè)網(wǎng)站,

這里是中國(guó)站下載地址:https://developer.android.google.cn/ndk/downloads/index.html

比較下發(fā)現(xiàn)貌似就是google后面加了cn,所以以后如果沒有遇到developer.android.google打不開網(wǎng)站鏈接的情況下可以試試加cn訪問中國(guó)站啦。

選擇所需版本。



下好之后解壓到android-ndk文件夾中,然后配置環(huán)境。

再通過cmd進(jìn)入命令行,輸入ndk-build檢測(cè)是否配置好。

此時(shí),如下圖所示:


切換到Android程序src/main/jni目錄中,直接執(zhí)行ndk-build腳本就可以了。


成功生成如下圖所示。

生成是SO文件在 src/main/libs/armeabi-v7a中


現(xiàn)在,還需要配置gradle文件才能運(yùn)行。

在buildTypes之前的位置加上,

sourceSets.main{

jniLibs.srcDir'src/main/libs'

jni.srcDirs=[]

}


這時(shí)就可以運(yùn)行程序查看效果了。

報(bào)了個(gè)錯(cuò)。android:onClick不能用

參考網(wǎng)址:http://blog.csdn.net/shaw1994/article/details/18953771

http://blog.csdn.net/xlh1191860939/article/details/53019592

java.lang.IllegalStateException: Could not execute method for android:onClick


結(jié)果發(fā)現(xiàn)是因?yàn)閤ml文件中context沒配置好。

cannot resolve corresponding JNI function的解決方法

File--->Setting--->plugins

將 Android NDK Support 的對(duì)勾勾掉

然后重啟AS

過程中還發(fā)現(xiàn)一個(gè)問題,結(jié)果發(fā)現(xiàn)是因?yàn)樯傻腸om_cc_myapplication_MainActivity.h文件不全導(dǎo)致的。(因?yàn)樵诰帉慚ainActivity之前生成了),因此無(wú)法調(diào)用native函數(shù)。

產(chǎn)生這個(gè)錯(cuò)誤表示無(wú)法調(diào)用native函數(shù),沒有配置好。

07-30 20:32:15.460 19330-19330/com.cc.myapplication E/art: No implementation found for java.lang.String com.cc.myapplication.MainActivity.avformatinfo() (tried Java_com_cc_myapplication_MainActivity_avformatinfo and Java_com_cc_myapplication_MainActivity_avformatinfo__)


還有這里也需要改,總之,無(wú)法調(diào)用的話,一定是沒有配置好。復(fù)制代碼的時(shí)候,得看看包名是否都改了,又或者,你可以直接把自己的工程的包名建成跟作者一樣,這樣就不用改了。

改完之后,需要重新使用ndk-build編譯生成可以通過JNI調(diào)用的類庫(kù),否則還是之前生成的類庫(kù),依然會(huì)報(bào)錯(cuò)。

其實(shí)程序調(diào)用的是這里的文件。


最后成功圖片有4張,分別點(diǎn)擊4個(gè)按鈕結(jié)果如下圖:



編譯FFmpeg生成了六個(gè)SO文件,現(xiàn)在把這6個(gè)合成一個(gè),修改腳本文件build_android.sh。



改為

–enable-static

–disable-shared

以及在install后面加上一段。

然后重新開始編譯ffmpeg庫(kù)。



syntax error: unexpected end of file

DOS下文件和Linux下文件格式差異問題導(dǎo)致的。

發(fā)現(xiàn)是這段出現(xiàn)了問題(因?yàn)閯h掉這里才可以正常編譯)。

dos2unix build_android.sh? 嘗試使用這個(gè)刪除多余的空格,但是依然不行。http://blog.csdn.net/pml18710973036/article/details/68482885

解決辦法應(yīng)該是需要使用vim來(lái)轉(zhuǎn)換格式。這里就這樣吧,應(yīng)該是換行引起的錯(cuò)誤,需要使用Linux環(huán)境來(lái)進(jìn)行編寫shell文件,我先跳過這個(gè)問題,不再多糾結(jié)。

$TOOLCHAIN/bin/arm-linux-androideabi-ld \

-rpath-link=$PLATFORM/usr/lib \

-L$PLATFORM/usr/lib \

-L$PREFIX/lib \

-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \

$PREFIX/libffmpeg.so \

libavcodec/libavcodec.a \

libavfilter/libavfilter.a \

libswresample/libswresample.a \

libavformat/libavformat.a \

libavutil/libavutil.a \

libswscale/libswscale.a \

-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \

$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \


$ chmod +x build_android.sh

$ ./build_android.sh


————————————————————————————

這里是坑的分割線。。。。

參考鏈接:

最主要是這個(gè)鏈接:http://www.ihubin.com/blog/android-ffmpeg-demo-2/ ?

http://blog.csdn.net/hejjunlin/article/details/52661331

http://blog.csdn.net/leixiaohua1020/article/details/47008825

http://www.lxweimin.com/p/dfd0de17601c

http://www.cnblogs.com/tt2015-sz/p/6148723.html


Windows下使用MinGW編譯FFmpeg

https://forevas.github.io/2017/03/20/Windows%E4%B8%8B%E4%BD%BF%E7%94%A8MinGW%E7%BC%96%E8%AF%91FFmpeg/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容