Android ffmpeg详解

 

一、编译ffmpeg:

1、准备android ndk:

  • ubuntu解压ndk安装包:unzip android-ndk-r20-linux-x86_64.zip

2、准备ffmpeg:

  • 解压ffmpeg:tar -Jxvf ffmpeg-3.3.3.tar.xz

3、编译ffmpeg:

  • 修改configure:因为android只能加载.so结尾的动态库,不能识别.so.57结尾的动态库,所以需要作如下修改
#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)'
  • 编写编译脚本:
#!/bin/bash 
NDK=/home/dpc/workspace/ndk/android-ndk-r12b
SYSROOT=${NDK}/platforms/android-21/arch-arm
TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_so
{
./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=./android/$CPU
ADDI_CFLAGS="-marm"
build_so
#!/bin/bash
#设置ndk路径 ubuntu上安装的ndk绝对路径
export NDK_HOME=/home/dpc/ndk/android-ndk-12b
#设置使用ndk的版本号 一般9之上
export PLATFORM_VERSION=android-16
function build
{
	echo "start build and path is $PREFIX"
	echo "ARCH is $ARCH"
	echo "CROSS_COMPILE is $CROSS_COMPILE"
	./configure --target-os=linux \
	--prefix=$PREFIX  --arch=$ARCH \
	--enable-doc \
	--enable-shared \
	--disable-static \
	--disable-yasm \
	--disable-asm \
	--disable-symver \
	--enable-gpl \
	--disable-ffmpeg \
	--disable-ffplay \
	--disable-ffprobe \
	--disable-ffserver \
	--cross-prefix=$CROSS_COMPILE \
	--enable-cross-compile \
	--sysroot=$SYSROOT \
	--enable-small \
	--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
	--extra-ldflags="$ADDI_LDFLAGS" \
	$ADDITIONAL_CONFIGURE_FLAG
	make clean
	make
	make install
	echo "build ffmpeg for $ARCH finished"
}
#arm
ARCH=arm
CPU=arm
#设置输出目录:新建android/平台目录
PREFIX=$(pwd)/android/$ARCH
#设置交叉工具路径:这里我们用的ndk里面的交叉工具编译链
TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
#设置交叉工具依赖库
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
ADDI_CFLAGS="-marm"
#设置环境参数
SYSROOT=$NDK_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH/
build
  • 运行configure:sudo ./configure

  • 运行编译脚本:sudo ./build_android.sh

  • 脚本运行完成,不出意外的话就会在当前目录生成一个android目录作为输出目录
  • 拷贝输出目录:直接在linux文件管理器里面复制会出现错误,是因为输出目录被锁定需要更改权限,如下

4、错误处理:

  • C compiler test failed(执行./configure):

根据上面提示,我的虚拟机环境没有安装gcc,所以现在需要安装gcc,输入下面命令进行安装gcc:

上面的错误是无法进行apt命令,因为apt被进程占用,网上的一些资料是讲apt的进程kill掉,但是最后测试没成功,我就只有重启虚拟机了,重启虚拟机后输入下面命令:

  • yasm/nasm not found or too old:因为ffmpeg编译需要用yasm进行反汇编,因此需要安装yasm

下载yasm:wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

解压yasm:tar zxvf yasm-1.3.0.tar.gz

切换yasm:cd yasm-1.3.0

配置yasm:./configure

编译yasm:make

安装yasm:sudo make install (注意需要sudo否则因为没有权限而安装失败)

  • No such file or directory:

最初觉得很奇怪,明明有这个路径,在执行脚本的时候非报出找不到的错误,一直还以为是权限问题,后面chmod 777 ndk路径后并没有什么卵用。细心的同学们可能会发现最后command也没有找到,查阅很多资料才发现应该是字符格式不对导致脚本文件的内容无法被解析,果然如此,去掉了一些空格后就对了,这个问题的根本在于windows与linux的字符编码不一致导致,因此建议我们复杂bash的时候最好使用一个记事本来作为中间转换一下。如下,去掉后面空格字符串

  • C compiler test failed:

查阅很多资料,最后明白了一点,在编译ffmpeg可能不是那么一帆风顺,最终的问题原因可能都主要围绕ffmpeg与ndk的交叉编译工具的兼容性问题

提示是arm-linux-androideabi-gcv没有找到,我们进入到android-ndk-r20里面发现确实没有这个gcc工具:

查阅资料后貌似ndk后续版本已经开始弃用gcc改用clang撒玩意的了。好吧,经过无论怎么编译都没有在指定的目录下生成动态库,然后输出日志中又没有地方报错,我开始怀疑人生,那么一切都没有问题,那会不是两者兼容问题,为此我下载了低版本的ndk:

果然,把运行脚本中的ndk路径改成android-ndk-r12b,然后运行该脚本,完美生成so文件

  • Input/output error:编译的时候出现error导致编译无法进行,因为同样的方式我已经测试过是没有毛病的,唯一的区别就是ffmpeg的目录我是放在windows下面的共享目录里面,也不确定是不是这个原因,反正将ffmpeg放在linux下非挂载的目录下面编译OK

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神黄昏EX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值