ffmpeg开发之编译forAndroid

ffmpeg是一个开源的,功能强大的音视频处理库,可以实现视频编解码,音频采集解码,现在很多的手机上的直播软件用的就是这个开源库。今天写一篇博客来记录自己编译的过程,以免忘记。

编译环境:

系统:Ubuntu 18.04.3 LTS(虚拟机 64位)

FFmpeg (4.1.3)

NDK(android-ndk-r15c)

make

集成步骤:

下载ffmpeg源码:ffmpeg下载地址

下载NDK工具:NDK下载地址

解压ffmpeg源码包,并改名为ffmpeg,同时解压NDK压缩包

修改配置文件

默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这样的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.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_VERSION='$(SLINAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
配置修改完后开始编写编译脚本。

编写脚本:

在ffmpeg源码目录下创建一个.sh的编译脚本,脚本名称可以随意取,这里直接给出脚本内容:

make clean
NDK=../android-ndk-r17c
SYSROOT=$NDK/platforms/android-14/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CPU=armv7-a
x264=./x264/
EXTRA_CFLAGS="-I./x264/include"
EXTRA_LDFLAGS="-L./x264/lib"
PREFIX=./libs
./configure \
        --target-os=android \
        --prefix=$PREFIX \
        --arch=arm \
        --cpu=armv7-a \
        --disable-doc \
        --disable-static \
        --disable-asm \
        --enable-cross-compile \
        --cross-prefix=$CROSS_PREFIX \
        --sysroot=$SYSROOT \
        --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
        --enable-version3 \
        --enable-pthreads \
        --disable-encoders \
        --disable-decoders \
        --disable-avdevice \
        --disable-network \
        --disable-symver \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-debug \
        --enable-neon \
        --enable-shared \
        --enable-small \
        --enable-libx264 \
        --enable-gpl \
        --enable-pic \
        --enable-jni \
        --enable-mediacodec \
        --enable-encoder=aac \
        --enable-encoder=gif \
        --enable-encoder=libopenjpeg \
        --enable-encoder=libmp3lame \
        --enable-encoder=libwavpack \
        --enable-encoder=mpeg4 \
        --enable-encoder=pcm_s16le \
        --enable-encoder=png \
        --enable-encoder=mjpeg \
        --enable-encoder=srt \
        --enable-encoder=subrip \
        --enable-encoder=yuv4 \
        --enable-encoder=text \
        --enable-decoder=aac \
        --enable-decoder=acc_latm \
        --enable-decoder=libopenjpeg \
        --enable-decoder=mp3 \
        --enable-decoder=mpeg4_mediacodec \
        --enable-decoder=pcm_s16le \
        --enable-decoder=flac \
        --enable-decoder=flv \
        --enable-decoder=gif \
        --enable-decoder=png \
        --enable-decoder=srt \
        --enable-decoder=xsub \
        --enable-decoder=yuv4 \
        --enable-decoder=vp8_mediacodec \
        --enable-decoder=h264_mediacodec \
        --enable-decoder=hevc_mediacodec \
        --enable-bsf=h264_mp4toannexb \
        --enable-bsf=hevc_mp4toannexb \
        --enable-protocols \
        --extra-cflags="$ADDI_CFLAGS -I$NDK/sysroot/usr/include/arm-linux-androideabi -isysroot $NDK/sysroot -fPIC -marm -march=armv7-a $EXTRA_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS $EXTRA_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG


echo "end!"
                                                       

 

 

这里面包含了x264的合并到ffmpeg的操作,如果没有必要可以去掉。保存好文件,开始编译文件:

1、给文件授权:chmod 7777 xxxxx.sh(这个xxxx 是自己定义的编译文件名)

2、执行编译文件:./xxxxx.sh

3、执行 make 指令  (如果权限不足的情况下需要 执行 sudo make)

4、执行make install 指令 (如果权限不足的情况下需要 执行 sudo make install)

这四步就可以完成 ffmpeg 编译 成 so 动态库 生成的文件的路径就是编译文件中 PREFIX 这个值指定的位置

编译成功的文件就在lib这个目录下。到此ffmpeg编译成so就完成了。

这里补充 编译armv8-a 的编译文件
 

make clean
NDK=../android-ndk-r17c
SYSROOT=$NDK/platforms/android-21/arch-arm64
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
CPU=armv8-a
ARCH=arm64
x264=./x264/
EXTRA_CFLAGS="-I./x264/include"
EXTRA_LDFLAGS="-L./x264/lib"
PREFIX=$(pwd)/android/$CPU
./configure \
	--target-os=android \
	--prefix=$PREFIX \
	--arch=$ARCH \
	--cpu=$CPU \
	--disable-doc \
	--disable-static \
	--disable-asm \
	--enable-cross-compile \
	--cross-prefix=$CROSS_PREFIX \
	--sysroot=$SYSROOT \
	--cc=$TOOLCHAIN/bin/aarch64-linux-android-gcc \
	--enable-version3 \
	--enable-pthreads \
	--disable-network \
	--disable-symver \
	--disable-ffmpeg \
	--disable-ffplay \
	--disable-ffprobe \
	--disable-debug \
	--enable-neon \
	--enable-shared \
	--enable-small \
	--disable-libx264 \
	--enable-gpl \
	--enable-pic \
	--enable-jni \
	--enable-mediacodec \
	--enable-encoder=aac \
	--enable-encoder=gif \
	--enable-encoder=libopenjpeg \
	--enable-encoder=libmp3lame \
	--enable-encoder=libwavpack \
	--enable-encoder=mpeg4 \
	--enable-encoder=pcm_s16le \
	--enable-encoder=png \
	--enable-encoder=mjpeg \
	--enable-encoder=srt \
	--enable-encoder=subrip \
	--enable-encoder=yuv4 \
	--enable-encoder=text \
	--enable-decoder=aac \
	--enable-decoder=acc_latm \
	--enable-decoder=libopenjpeg \
	--enable-decoder=mp3 \
	--enable-decoder=mpeg4_mediacodec \
	--enable-decoder=pcm_s16le \
	--enable-decoder=flac \
	--enable-decoder=flv \
	--enable-decoder=gif \
	--enable-decoder=png \
	--enable-decoder=srt \
	--enable-decoder=xsub \
	--enable-decoder=yuv4 \
	--enable-decoder=vp8_mediacodec \
	--enable-decoder=h264_mediacodec \
	--enable-decoder=hevc_mediacodec \
	--enable-bsf=h264_mp4toannexb \
	--enable-bsf=hevc_mp4toannexb \
	--enable-protocols \
	--enable-hwaccels \
	--extra-cflags="$ADDI_CFLAGS -I$NDK/sysroot/usr/include/aarch64-linux-android -isysroot $NDK/sysroot -fPIC  -march=$CPU" \
	--extra-ldflags="$ADDI_LDFLAGS" \
	$ADDITIONAL_CONFIGURE_FLAG


echo "end!"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值