- Ubuntu16.04
- FFMPEG 3.2.1
- android-ndk-r13b
FFmpeg是功能強大的多媒體編解碼庫,廣泛應用於各個平台的主流播放器、轉碼等軟件。在Android框架對視頻播放、編解碼的支持沒有那麼強大時,使用ffmpeg也是不二的選擇。本文介紹使用ndk編譯ffmpeg的過程。
在看了很多人寫的編譯方法,嘗試了很多方案後,發現只有下面這個方法能夠一次成功,其他都會出各種各樣的問題。
上圖中的流程可以分為“編譯FFmpeg類庫”、“編寫Java端代碼”、“編寫C語言端代碼”三個步驟。
- 下載安裝NDK
- 下載NDK之後直接解壓縮就可以使用了。在Windows下使用的時候需要用到Cygwin。在這裡我自己使用Linux編譯
- 下載FFMPEG
- 解壓縮後首先需要對源代碼中的configure文件進行修改。由於編譯出來的動態庫文件名的版本號在.so之後(例如“libavcodec.so.5.100.1”),而android平台不能識別這樣文件名,所以需要修改這種文件名。在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)'
在ffmpeg目錄下添加編譯腳本build_android.sh,腳本中寫入以下代碼。腳本中主要是執行configure,然後執行make。
build_android.sh
#!/bin/bash
NDK=/home/cheng/Android/android-ndk-r13b
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-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
大家記得修改前3個參數為自己電腦的環境
其中configure的參數加瞭如下一些:
prefix 指定了編譯結果的目錄;
enable 和disable 指定了需要編譯的項;
cross-prefix指定了交叉編譯的工具鏈中gcc文件;
target-os 不用說,是目標操作系統;
arch cpu類型;
sysroot androdlib目錄。
更多conigure參數可參考./configure --help。
然後修改build_android.sh文件的權限:
sudo chmod +x build_android.sh開始編譯喝杯咖啡等個10~20分鐘吧
有完成的話FFMPEG會生成android的資料夾
android/arm/lib 會有很多.so檔
編譯不出來的話這裡有編好的直接用吧
Reference:
http://blog.csdn.net/leixiaohua1020/article/details/47008825
http://www.jianshu.com/p/313f378f9922
http://blog.csdn.net/hejjunlin/article/details/52661331
http://www.itread01.com/articles/1475294828.html



No comments:
Post a Comment