編譯Android下可用的全平臺FFmpeg(包含libx264與libfdk-aac)
原始碼或工具版本:
- ndk :r14
- FFmpeg 版本:3.2.5
- libfdk-aac 版本:0.1.5
一、原始碼準備:
這裡假設你已經擁有了ndk環境,沒有的可以先配置,可以參考Android下玩JNI的新老三種姿勢。
二、編寫全平臺指令碼:
- ffmpeg-3.2.5
- jianxi_ffmpeg_build_all.sh
- jianxi_ffmpeg_arm64_v8a_build.sh
- jianxi_ffmpeg_arm_build.sh
- jianxi_ffmpeg_arm_v7a_build.sh
- jianxi_ffmpeg_x86_64_build.sh
- jianxi_ffmpeg_x86_build.sh
- jianxi_ffmpeg_build_all_more.sh
- jianxi_ffmpeg_arm64_v8a_build_more.sh
- jianxi_ffmpeg_arm_build_more.sh
- jianxi_ffmpeg_arm_v7a_build_more.sh
- jianxi_ffmpeg_x86_64_build_more.sh
- jianxi_ffmpeg_x86_build_more.sh
- fdk-aac-0.1.5
- fdk_aac_arm64_v8a_build.sh
- fdk_aac_arm_build.sh
- fdk_aac_build_all.sh
- fdk_aac_mips_build.sh
- fdk_aac_x86_64_build.sh
- fdk_aac_x86_build.sh
- libx264
- x264_arm64_v8a_build.sh
- x264_arm_build.sh
- x264_build_all.sh
- x264_mips_build.sh
- x264_x86_64_build.sh
- x264_x86_build.sh
jianxi_ffmpeg_build_all.sh 可生成精簡版的全平臺 FFmpeg 動態庫,產物目錄為:/ffmpeg-3.2.5/android/,jianxi_ffmpeg_build_all_more.sh 將生成增強版的全平臺 FFmpeg 動態庫,產物地址為:/ffmpeg-3.2.5/android_more。
三、修改指令碼和原始碼
1、如果你用我原始碼:
你如果直接下載我修改好的 FFmpeg 原始碼與 libfdk-aac 原始碼那麼你需要做的工作將會少一些,你找到上面所列目錄結構裡的指令碼,修改每個腳本里面 "NDK" 變數所指向的地址為你本機地址,其次如果你不是 mac 系統而是 Linux 系統,那麼你還需要把裡面包含 darwin-x86_64 的字樣修改為 linux-x86_64。
2、如果重新下載官方原始碼:
這樣你需要做的工作為稍微多一些。
- 首先你下載好了 FFmpeg、libx264、libfdk-aac 然後解壓且按照上面 二 中我列的目錄結構排放這個三個庫的原始碼。
- 把指令碼按照對應按照目錄結構放入相應資料夾。
- 修改每個腳本里面 "NDK" 變數所指向地址為你本機地址,其次如果你不是 mac 系統而是 Linux 系統,那麼你還需要把裡面包含 darwin-x86_64 的字樣修改為 linux-x86_64。
- 對 FFmpeg 原始碼中的configure檔案進行修改。由於編譯出來的動態庫檔名的版本號在.so之後(例如“libavcodec.so.5.100.1”),而android平臺不能識別這樣檔名,所以需要修改這種檔名。
找到 FFmpeg 目錄下的configure檔案,開啟找到以下幾行:
替換為下面內容:SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
- 對 libfdk-aac 進行修改
進入 在 libfdk-aac 目錄下找到 m4 目錄並開啟裡面的 libtool.m4 檔案:
全域性搜尋 so.1,替換為 so
全域性搜尋 $versuffix ,替換為空字元,也就是刪除它
全域性搜尋 $major ,,替換為空字元,也就是刪除它
編譯
開啟終端, cd 進入你的 ffmpeg 目錄,新建一個 ffmpegtemp 目錄,也就是執行 mkdir ffmpegtemp 即可。
然後如果你需要編譯全架構,執行:
./jianxi_ffmpeg_build_all.sh 或 ./jianxi_ffmpeg_build_all_more.sh
如果你只編譯某個平臺執行響應指令碼即可。
收集產物
精簡版的 FFmpeg 的 動態庫目錄在 ffmpeg-3.2.5/android 下,增強版的 FFmpeg 的 動態庫目錄在 ffmpeg-3.2.5/android_more 下。
溫馨提示
由於我編寫指令碼的時候是根據自己的目錄和電腦配置來的,比如 libx264 、fdk-aac-0.1.5 等目錄在指令碼中寫死的,再比如編譯的時候我用來 make -j16 ,這表示有16個執行緒併發編譯,我電腦編譯全架構時發熱也超級厲害,你可以根據自己配置跳轉這個數值。
我 FFmpeg 的編譯選項中開啟了 neon與 yasm ,這都是一些優化配置,如果你編譯的時候發現它們妨礙了你,可以將其關閉。
如果你想跟著我一起測試編譯好的 FFmpeg 在 Android 上的表現可以鎖定 編譯Android下可執行命令的FFmpeg 這個頻道