Blog
Blog copied to clipboard
FFmpeg编译Android版本踩坑之旅
背景
最新需要移植ffmpeg到Android上,但网上的方法绝大多数只是适合比较老的版本,在编译最新版的过程中遇到了一些问题,所以才有了这次的踩坑之旅。
- FFmpeg使用最新版本4.1
- NDK使用android-ndk-r17c版本
错误1
libavformat/udp.c: In function 'udp_set_multicast_sources': libavformat/udp.c:290:28: error: request for member 's_addr' in something not a structure or union mreqs.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
用NDK14版本编译会报这个错误,升级到NDK17,不要升级到NDK17以后版本,因为17以后版本GCC分离了。
错误2
atal error: stdint.h: No such file or directory
include_next <stdint.h>
在NDK目录下搜索,找到./sysroot/usr/include/stdint.h
因为NDK将头文件和库文件进行了分离,指定的--sysroot只有库文件,头文件放在NDK目录下的sysroot内,只需在--extra-cflags中添加 -isysroot $NDK/sysroot即可。
错误3
fatal error: asm/types.h: No such file or directory #include <asm/types.h>
在NDK目录下搜索这个文件
因为是64位机器,所以就用
./sysroot/usr/include/aarch64-linux-android/asm/types.h
目录下的。找到了头文件就好办了,在CFLAGS添加上相应的头文件就可以了~i$NDK//sysroot/usr/include/aarch64-linux-android~
32位机器用这个路径sysroot/usr/include/arm-linux-androideabi/asm/types.h
完整脚本
#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/home/jason/Android/ndk/android-ndk-r17c
INCLUDE=$NDK/sysroot/usr/include
#5.0
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
#输出路径
PREFIX=./android/$CPU
function buildFF
{
echo "开始编译ffmpeg"
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--cpu=$CPU \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAG" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
# --disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j8
make install
echo "编译结束!"
}
###########################################################
echo "编译支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/armv7-a-neon-hard
CFLAG="-I$INCLUDE -I$INCLUDE/arm-linux-androideabi -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp"
ADD="--enable-asm \
--enable-neon \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec "
buildFF
###########################################################
echo "编译不支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/$CPU
CFLAG="-I$INCLUDE -I$INCLUDE/arm-linux-androideabi -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp"
ADD=
buildFF