Blog icon indicating copy to clipboard operation
Blog copied to clipboard

FFmpeg编译Android版本踩坑之旅

Open jason--liu opened this issue 5 years ago • 0 comments

背景

最新需要移植ffmpeg到Android上,但网上的方法绝大多数只是适合比较老的版本,在编译最新版的过程中遇到了一些问题,所以才有了这次的踩坑之旅。

错误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目录下搜索这个文件 image 因为是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

参考资料

在Mac上编译基于Android平台的FFmpeg源码 移植FFMpeg到Android

jason--liu avatar Sep 18 '19 14:09 jason--liu