手把手圖文并茂教你用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