本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布
背景:
公司項(xiàng)目哪痰,iOS端說Android端拍的視頻,碼率不對(duì)茂装,他無法播放怎诫。圖片和視頻的選擇或拍攝一直用的PictureSelector,問了開源作者才知道錄制的沒做任何處理蓝晒,直接調(diào)用的系統(tǒng)拍攝腮出,只提供了設(shè)置拍攝的質(zhì)量為0還是1的方法,無奈芝薇,只能想著自己壓縮了胚嘲。說到視頻的處理,現(xiàn)在最火的肯定還是FFmpeg洛二。FFmpeg的移植馋劈,不難,就是太坑了晾嘶。既然移植比較麻煩妓雾,我想著能不能將FFpemg移植后封裝成一個(gè)lib,以后其他項(xiàng)目使用直接引用垒迂,不需要再移植了械姻,經(jīng)過三天的各種折騰和測(cè)試,終于成功了机断。楷拳。绣夺。。
A 源碼下載
首先把ffmpeg-3.2.4的源碼下載下來唯竹,源碼最好就下載我這個(gè)乐导,我最開始用的官網(wǎng)的最新版本,build的時(shí)候老是報(bào)錯(cuò)浸颓,最后換成3.2.4物臂,就不再報(bào)錯(cuò)了!
下載下來后解壓放到純英文路徑下产上,然后將源碼路徑添加到環(huán)境變量中
B 編譯FFmpeg生成.so文件
1 在main目錄下新建jni文件夾
直接點(diǎn)擊finish自動(dòng)生成
2 copy FFmpeg的源碼和.mk文件到j(luò)ni
將Demo中jni里的這些文件拷貝到你model中的jni棵磷,圖中紅色選中的三個(gè)不要復(fù)制,這個(gè)是根據(jù)項(xiàng)目生成的(如果你直接引用這個(gè)model晋涣,就不用管)仪媒。
3 如圖將FFmpegKit的代碼copy到j(luò)ava工程中
4 編譯FFmpegKit
控制臺(tái)中切到j(luò)ava文件夾目錄下,輸入javah com.ffmpegtest.xxx.utils.FFmpegKit (FFmpegKit的引用路徑)谢鹊,只有在java目錄下執(zhí)行這行命令才能成功算吩,直接進(jìn)到Utils目錄執(zhí)行會(huì)報(bào)找不到.so文件,編譯成功后會(huì)生成圖中黑框中的兩個(gè)c++文件佃扼,剪貼這兩個(gè)文件到j(luò)ni文件夾中
5 創(chuàng)建com_ffmpegtest_www_utils_FFmpegKit.c文件
你或許會(huì)注意到新建的文件和生成的哪個(gè).h文件名稱一致偎巢,只是格式不同。對(duì)兼耀,沒錯(cuò)压昼,必須一致,這是按照項(xiàng)目包名生成的瘤运,不能隨便更改窍霞!
6 修改Android.mk和Application.mk
1 更改Android.mk中LOCAL_SRC_FILES值和FFmpeg源碼路徑
2 Application.mk中,設(shè)置生成so庫拯坟,這里我們只設(shè)置生成armeabi-v7a下的(其他庫空格添加生成但金,考慮到生成的so文件都是10M+,就沒設(shè)置其他的)
6 其他配置
1 在app下的gradle中設(shè)置so庫支持和路徑讀人扑:
2 Manifest中添加版本設(shè)置(別忘了添加讀寫和攝像頭權(quán)限)
3 gradle.properties中添加 android.useDeprecatedNdk=true傲绣,不添加可能會(huì)爆xxx.so" is 32-bit instead of 64-bit的錯(cuò)誤
C 編譯FFmpeg生成.so文件
以上配置完成后,就可以編譯了巩踏,控制臺(tái)中切換到j(luò)ni目錄下秃诵,執(zhí)行ndk-build命令(需要配置ndk),執(zhí)行完成后塞琼,會(huì)自動(dòng)生成libs和obj兩個(gè)文件夾菠净,這就是我們需要的.so文件了。
這里插一句:如果編譯的時(shí)候報(bào)各種警告,生成的.so是不行的毅往,把我們上面的新建的哪個(gè)com_ffmpegtest_www_utils_FFmpegKit.c文件牵咙,隨便亂刪除點(diǎn)東西保存后執(zhí)行ndk-build,然后再恢復(fù)正確攀唯,再執(zhí)行ndk-build洁桌,不要問我為什么,姑且理解為編譯器不識(shí)好歹侯嘀!
D 總結(jié)
到此為止另凌,F(xiàn)Fmpeg的移植就完成了,至于怎么壓縮怎么添加水印戒幔,那是FFmpeg命令行的具體應(yīng)用了吠谢,大家結(jié)合著Demo和FFmpeg文檔自求多福吧。Demo中的ffmpeglib已經(jīng)封裝好诗茎,大家可以在項(xiàng)目中直接import model使用(親測(cè)沒問題)工坊,避免了每次都要編譯,而且獨(dú)立的mk和gradle配置敢订,免去了和其他第三方庫的沖突王污。
十分感謝reverse_Android對(duì)此次集成的幫助和解答。
參考文章:
最簡(jiǎn)單的基于FFmpeg的移動(dòng)端例子:Android HelloWorld
仿微信視頻拍攝UI, 基于ffmpeg的視頻錄制編輯(上)(api>22的情況下無法找不到so文件楚午,慎用)
碎碎念:諸君若是喜歡玉掸,請(qǐng)star,謝謝醒叁!
更多問題加群:584275290