欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FFmpeg编译Android so文件

程序员文章站 2022-07-01 15:30:22
...

说明:
FFmpeg可以用来进行音视频编解码,添加水印,rtmp推流等一系列处理,可以使用命令执行,或者使用api调用。

FFmpeg的音视频编码是一种软编码,可以支持各种编码器的设置。以下将基于fdk-aac音频和x264视频编码进行展开。其中,fdk-aac是对音频进行aac编码,x264是对视频进行h264编码,二者都需要跟ffmepg一起进行编译生成Android所需的so文件。

如下提供一份具体的编译脚本,只针对armv7a。

1.x264编译:
vi /etc/ld.so.conf
加入:/usr/local/lib

安装git: sudo apt-get install git
下载x264: git clone https://code.videolan.org/videolan/x264.git

创建build_x264文件: touch build_x264
vi build_x264
添加如下内容:

#!/bin/bash
export NDK=/home/work/ndk-dir/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-22/arch-arm
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export ARCH=arm
export CPU=armv7a
export API=22
export TARGET=i686-linux-android
export PREFIX=/usr/local                     
export CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
export ADDI_CLFAGS=""

./configure --prefix=$PREFIX \
            --enable-shared \
            --enable-static \
            --enable-pic \
            --cross-prefix=$CROSS_PREFIX \
            --host=arm-linux \
            --sysroot=$SYSROOT \
$ADDITIONAL_CONFIGURE_FLAG

make clean
make -j4
sudo make install
sudo ldconfig

修改so文件名:
vi configure
将libx264.so.$API 修改为libx264.so

执行编译: source build_x264
编译成功后文件位于/usr/local/include,/usr/local/lib

2.编译fdk-aac:
下载:
wget https://downloads.sourceforge.net/opencore-amr/fdk-aac-2.0.0.tar.gz
tar -xzf fdk-aac-2.0.0.tar.gz

创建build文件: touch build_fdk_aac
vi build_fdk_aac
添加以下内容:

#!/bin/bash
NDK=/home/hoo/work/ndk-dir/android-ndk-r13b
SYSROOT=$NDK/platforms/android-22/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
API=22

export PREFIX=/usr/local #编译的so目录
CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
ARM_INC=$SYSROOT/usr/include
ARM_LIB=$SYSROOT/usr/lib

LDFLAGS=" -L$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/lib -L$ARM_LIB -lc -lgcc -lm -ldl "

export CXX="${CROSS_PREFIX}g++ --sysroot=${SYSROOT}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_PREFIX}gcc --sysroot=${SYSROOT}"

./configure --prefix=$PREFIX \
            --enable-shared \
            --enable-static \
            --host=arm-linux \

make clean
make -j8
sudo make install
sudo ldconfig

修改so文件名:
进入m4目录
vi libtool.m4

替换so.1为so
替换$versuffix为空
替换$major为空

全局替换命令,如:
 :%s/$major//g

执行编译: source build_fdk_aac
编译成功后文件位于/usr/local/include,/usr/local/lib

3.ffmpeg,fdk-aac,x264一起编译
下载ffmpeg:
wget http://ffmpeg.org/releases/ffmpeg-4.1.4.tar.gz
tar -xzf ffmpeg-4.1.4.tar.gz

cd ffmpeg-4.1.4
vim 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)'

touch android_build.sh
vim android_build.sh
添加如下:

#!/bin/bash
make clean
export NDK=/home/hoo/work/ndk-dir/android-ndk-r20b
export SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
export CPU=armv7a
export API=22
export TARGET=$CPU-linux-androideabi
export PREFIX=$(pwd)/android/$CPU
export CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
export ADDI_CFLAGS="-D__ANDROID_API__=$API -U_FILE_OFFSET_BITS -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD -Os -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=neon -marm -I/usr/local/include"
export ADD_LDFLAGS="-marm -L/usr/local/lib"

./configure \
    --target-os=android \
    --prefix=$PREFIX \
    --cc=$TOOLCHAIN/$TARGET$API-clang \
    --cxx=$TOOLCHAIN/$TARGET$API-clang++ \
    --ld=$TOOLCHAIN/$TARGET$API-clang \
    --disable-stripping \
    --arch=arm \
    --disable-doc \
    --enable-neon \
    --enable-shared \
    --disable-static \
    --disable-symver \
    --enable-nonfree \
    --enable-gpl \
    --enable-libx264 \
    --enable-encoder=libx264 \
    --enable-libfdk-aac \
    --enable-encoder=libfdk_aac \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --cross-prefix=$CROBOSS_PREFIX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="$ADDI_CFLAGS" \
    --extra-ldflags="$ADD_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG

make clean
make -j8
make install

编译完成后so目录:/ffmpeg-4.1.4/android/armv7a
其中 --enable-neon 这一行设置后,测试发现编码速度会比不开快很多。

注: 以上脚本设置针对armv7a,其它架构可以进行相应修改。另外,上述脚本可以运行通过,编译后的so文件有些大,具体使用可以根据情况进行优化调整。

相关标签: 视频编码