Ubuntu下FFmpeg庫編譯方法


在自己編譯之前也是參考了很多網友的帖子,在此作一下簡單的記錄,以備后續只需。

最基本的編譯環境JDK+NDK,兩者的下載以及環境變量配置相對簡單,網上也一大把,不再細述。

本人使用的JDK版本:1.8.0_121,NDK版本:android-ndk-r13b,FFmpeg版本:ffmpeg-3.2.2

FFmpeg官方下載地址:https://ffmpeg.org/download.html

步驟1,下載解壓,進入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)'

步驟2:,ffmpeg根目錄新建android_build.sh文件,寫入如下配置內容,在此列出兩種配置文件內容:

注意:其中ANDROID_NDK就是在環境變量中設置的,PLATFORM和PREBUILT要按照實際的存放路徑對應修改!

  1)生成多個.so文件

#!/bin/bash
echo It is ok
PLATFORM=$ANDROID_NDK/platforms/android-9/arch-arm/
PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export SYSROOT
export TOOLCHAIN

function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffserver \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install
}
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one

步驟3,執行build_android.sh,編譯完成后,會在ffmpeg根目錄生成一個android文件目錄,進入android/armv7-a下會有如目錄,


其中在lib目錄下,一般生成以下6個:

libavformat: 用於各種音視頻封裝格式的生產和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;

libavcodec: 用於各種類型音視頻的編解碼;

libavutil: 一些公共的工具函數,用於簡化程序,其中包括隨機數生產器,數據結構,數學代碼,核心多媒體工具等;

libswscale: 用於執行高度優化的圖像縮放和顏色空間、像素格式轉換;

libswresample:用於執行高度優化的音頻重采樣,重新矩陣和取樣格式轉換操作;

libavfilter: 包含媒體過濾器的庫

   2)最終集成一個libffmpeg.so庫文件

#!/bin/bash
echo It is ok
PLATFORM=$ANDROID_NDK/platforms/android-9/arch-arm/
PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export SYSROOT
export TOOLCHAIN

function build_one
{
./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--disable-ffserver \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install

$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libavfilter/libavfilter.a libswscale/libswscale.a libavdevice/libavdevice.a libswresample/libswresample.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
}
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one
與1)不同的地方主要是修改-shared置為disable,-static置為enable,這樣make install出來的是多個靜態庫文件.


最后將這幾個靜態庫文件集成一個libffmpeg.so.


這就是整個編譯過程,如果出現編譯錯誤,找不到某些文件之類的問題,大都是因為.sh文件中的路徑有錯,或者直接粘貼復制的話會有編碼格式不同導致到語法錯誤,只能對症下葯,隨機應變,個別對待了。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com