手把手圖文并茂教你用Android Studio編譯FFmpeg庫并移植

今天就用 Android Studio編譯FFmpeg庫并移植,并附上調用ffmpeg簡單示例,看下Agenda如下:

  • 下載FFmpeg 3.1.3
  • 下載NDK
  • 配置ndk環境
  • 編譯FFmpeg
  • 移植到Android平臺
  • 調用編譯的so示例

下載FFmpeg 3.1.3

網址: https://ffmpeg.org/download.html#build-mac


雙擊解壓如下,得到一個文件夾:


 

下載NDK

  • 供參考下載地址見本文最下面,也可自行下載。
  • 雙擊解壓如下,同樣得到一個文件夾:

配置ndk環境

  • 啟動終端Terminal
  • 進入當前用戶的home目錄
    • 輸入cd ~ 或 /Users/YourUserName
  • 創建.bash_profile
    • 輸入touch .bash_profile
  • 編輯.bash_profile文件

    • 輸入open -e .bash_profile

    因為是為了配置NDK開發環境,輸入Android NDK下目錄,前面是android sdk的,可以不用動它,最終.bash_profile文件如下:

    export PATH=$(PATH):/Users/hejunlin/android-sdks/platform-tools    
    export NDK_ROOT=/Users/hejunlin/Downloads/android-ndk-r10e                    
    export PATH=$PATH:$NDK_ROOT
  • 保存文件,關閉.bash_profile
  • 更新剛配置的環境變量
    輸入source .bash_profile
  • 看看剛剛設置的環境變量

離開了編輯器后,在終端輸入 $PATH 并且按enter鍵來確認是否編輯成功,此時應該會出現所有的環境變量(以:號相分隔)

 


表明配置成功

 

接下來·開始進行測試ndk是否能正常編譯jni

(1) 終端進入到 NDK下面的 samples 目錄下。

(2) 輸入 cd hello-jni/ ,回車,然后執行 ndk-build

出現以下界面代表配置成功。


 

編譯FFmpeg

  • 在編譯前,在源碼中,修改FFmpeg的configure
  • 下載FFmpeg源代碼之后,首先需要對源代碼中的configure文件進行修改。由于編譯出來的動態庫文件名的版本號在.so之后(例如“libavcodec.so.5.100.1”),而android平臺不能識別這樣文件名,所以需要修改這種文件名。在configure文件中找到下面幾行代碼(在3209-3212行):
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)'

接下來開始寫shell腳本

這里有一個坑:我用記事本寫了個sh腳本,一直報如下錯誤:

這種情況應該有兩種原因:

 

  • 1.在WIN底下用文本編輯工具修改過參數變量,在保存的時候沒注意編碼格式造成的,
  • 2.也有可能是在VIM里修改,第一行末尾按到ctrl+v
    這里避開這個彎,我找到FFmpeg下一個version.sh的shell腳本,復制了一份
    重命名為build_android.sh。腳本如下:
#!/bin/sh
NDK=/Users/hejunlin/Downloads/android-ndk-r10e
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

如果大家要編譯,記得改下前三行,對應自己機器上的環境

接著開始執行這個shell腳本,在終端輸入 ./ build_android.sh , 如圖:

開始進行自動編譯:

中間過程:

喝杯咖啡時間,就編譯好了,結果如下:

這時會發現 FFmpeg下多了一個文件夾android:

打開如下:

這樣我們要的so就有了,當然,這只是基本的。

本文出自逆流的魚yuiop: http://blog.csdn.net/hejjunlin/article/details/52661331

移植到Android平臺

接下來寫在Android studio寫一個示例,調用ffmpeg中方法

建一個工程:在src/main下建一個jni目錄

把前面編譯好的android目錄移植過來

simplest_ffmpeg_helloworld.c代碼如下:

Android.mk文件內容如下:

本文出自逆流的魚yuiop: http://blog.csdn.net/hejjunlin/article/details/52661331

開始編譯目標so,在Studio中的Terminal面板中:執行ndk-build

(在此之前記得要在local.properties下配置ndk目錄)

會在libs下面生成一些so,也可以看到我們目標so:

然后建立一個jniLibs文件夾,把這些so拷貝進去

調用編譯的so示例

接著寫MainActivity代碼,如下:

最終效果如圖:

 

來自:http://www.androidchina.net/5772.html

 

 本文由用戶 vrfn8150 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!