1. 程式人生 > >ffmpeg2.6.2在Ubuntu下使用NDK編譯成.so檔案

ffmpeg2.6.2在Ubuntu下使用NDK編譯成.so檔案

參考blog:http://www.cnblogs.com/wainiwann/p/3785485.html

由於需要做視訊播放器,編解碼部分需要用到ffmpeg,沒辦法只能編譯ffmpeg.so

接下來就是參考網上多個ffmpeg的編譯過程,在多次嘗試後終於編譯成功,記錄下過程方便以後查詢,同時也跟大家分享下!

ps:不喜勿噴!

-------------------------------------------------------------------------

配置環境:

1、 安裝Ubuntu 10.04.4(32位)

2、下載ffmpeg-2.6.2.tar.bz2

3、下載android-ndk-r9d-linux-x86.tar.bz2(32位)

---------------------------------------------------------------------

4、ndk解壓目錄:/home/xxx/android-ndk-r9d(xxx:就是你的個人資料夾)

(1.) 配置NDK的環境變數:

終端內執行:“ gedit ~/.bashrc ”

在開啟的檔案末尾新增如下內容:

NDK=/home/xxx/android-ndk-r9d

export NDK

(2.)在當前bash環境下讀取並執行 ~/.bashrc 中的命令:

終端執行:" source  ~/.bashrc "

(3.)檢視是否生效:

終端執行: " echo $NDK

 "

結果:/home/xxx/android-ndk-r9d

(4.)測試NDK編譯JNI工程:

到android-ndk-r9d 的sample目錄的hello-jni 目錄裡

終端執行:“ $NDK/ndk-build ”

如果環境配置成功會生成so庫的。

-----------------------------------------------------------------

5、解壓ffmpeg-2.6.2.tar.bz2

將ffmpeg-2.2.tar.gz解壓後拷貝到任意目錄,本例是拷貝到.../android-ndk-r9d/sample/ffmpeg2.6.2 

在ffmpeg2.6.2檔案下新增" build_android.sh "檔案:(

ps:下面程式碼直接複製,如需修改注意“--prefix=$PREFIX \”前面的空格位

#!/bin/bash

SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86

function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --enable-gpl \
    --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

修改configure檔案:

很多ffmpeg編譯資料上面說要修改configure檔案 ,說的原因是 如果不修改的話,在android上 System.loadLibrary("xxx"); 的時候個別so庫無法載入的問題。

開啟 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)'

6、在ubuntu 32位下進行編譯ffmpeg原始碼以得到android平臺 arm下能使用的那幾個so庫

sudo chmod +x build_android.sh

./build_android.sh

---------------------------------------------------------------------

等待編譯,這個過程可能需要10~20分鐘,最後會在ffmpeg 2.6.2資料夾下的/android/arm/include+lib2個資料夾。

在lib資料夾下會有以下8個.so,最後我們需要的就是libavutil-54.so、libavcodec-56.so、libswresample-1.so、libavformat-56.so
libswscale-3.so、libpostproc-53.so、libavfilter-5.so、libavdevice-56.so。

得到這些so後,我們接下來的工作就是需要在android下使用,在下一篇文章中會接著說明。