1. 程式人生 > >編譯Android下可用的全平臺FFmpeg(包含libx264與libfdk-aac)

編譯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 這個頻道