使用NDK在Ubuntu16.01.12交叉编译FFmpeg+X
FFmpeg 在linux下编译后默认是不包含H264编码器(也就是x264)的
如果需要在安卓下使用FFmpeg进行h264解码可以直接下载 FFmpeg源码编译即可。
如需使用FFmpeg 进行h264编码 则需先下载x264源码使用NDK交叉编译出x264的静态库文件
1.下载NDK
下载地址:不受支持的 NDK 下载 | Android NDK | Android Developers (google.cn)
版本:修订版 14b (r14b)
下载完成后上传到Ubuntu的用户目录下,进行解压后即可。
2.下载x264源码,编译动态链接库
下载地址:x264, the best H.264/AVC encoder - VideoLAN
下载完成后上传到Ubuntu 的用户目录下(~)解压后得到 x264-master 文件夹(即源码文件)
2.1 进入x264-master 文件夹
2.2 创建一个文件夹名称为static作为x264的安装目录(也可以不创建 编译完后直接安装usr 下,建议创建一个)
2.3 创建一个build_x264.sh shell 脚本文件
shell 脚本创建出来时需要赋予可执行权限。
chmod +x build_x264.sh
2.4 编辑build_x264.sh
#!/bin/bash -v 2
#NDK的目录
NDK=/root/ff/android-ndk-r14b
#这里的两个目录需要和等会编译ffmpeg时保持一致 否则会出现找不到x264的错误
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PLATFORM=$NDK/platforms/android-21/arch-arm
#编译后进行make install 时的目录
PREFIX=/root/x264-master-test/static
echo "开始编译x264"
./configure --prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
make -j16
echo "编译结束!"
2.5 到这里可能报错./configure 没有权限
/configure: Permission denied 给 ./configure 文件赋予权限即可
chmod +x ./configure
再次执行build_x264.sh 文件 此时会提示
./config.guess: Permission denied
./config.sub: Permission denied
分别给这俩个文件赋予权限
chmod +x ./config.guess
chmod +x ./config.sub
再次执行build_x264.sh 文件 仍然会提示权限错误 = =!
但此时其实.configure 已经配置完成了,是make 时的权限有问题 。
./tools/cltostr.sh: Permission denied
chmod +x ./tools/cltostr.sh
再次执行build_x264.sh 文件 = =! 然后还会报一个错
'X264_VERSION' undeclared
在网上查了好久 说改版本号什么的都不好用,其实这里还是因为权限的问题。
chmod +x version.sh
不知道有没有什么好办法能在shell里或者其他地方 能让它自动赋予给这些需要权限的文件权限。不会linux 只能这样一步一步-,-
到这里基本就编译完了。
2.6 安装 这一步也可以写在build_x264.sh 里
make install
3.jpg
4.jpg
到这里 x264 算是安装完成
3.下载FFmpeg源码进行编译
下载地址:GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git
版本:release-3.4
下载完成后上传到Ubuntu 的用户目录下(~)解压后得到 FFmpeg-release-3.4文件夹(即源码文件)
3.1 进入FFmpeg-release-3.4文件夹
3.2 创建一个build_ffmpeg.sh 脚本文件,并赋予执行权限(chmod +x build_ffmpeg.sh)
3.3.1 编辑build_ffmpeg.sh (armeabi-v7a)
#!/bin/bash -v
echo "进入编译ffmpeg脚本"
#NDK目录 需和编译x264时的路径一直
NDK=/root/ff/android-ndk-r14b
#需和编译x264时的路径一直
PLATFORM=$NDK/platforms/android-21/arch-arm
#这个路径对应的build_x264.sh里的PREBUILT都是自定义变量名 非固定写法
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" \
#x264编译安装后的头文件路径
--extra-cflags="-I/root/x264-master-test/static/include " \
#x264编译安装后的库文件路径
--extra-ldflags="-L/root/x264-master-test/static/lib" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-small \
--enable-cross-compile \
--enable-static \
--enable-libx264 \
--enable-gpl \
--disable-x86asm \
--disable-debug \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j16
echo "编译结束!"
}
###########################################################
echo "编译不支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/$CPU
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
ADD=
buildFF
3.3.2 编辑build_ffmpeg_arm64v8-a.sh (arm64v8-a)
#!/bin/bash -v 2 echo "进入echo "进入编译ffmpeg脚本"
#NDK目录 需和编译x264时的路径一直
NDK=/root/ff/android-ndk-r14b
#需和编译x264时的路径一直
PLATFORM=$NDK/platforms/android-21/arch-arm64
#这个路径对应的build_x264.sh里的PREBUILT都是自定义变量名 非固定写法
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
CPU=armv8-a
#输出路径
PREFIX=./android/$CPU
function buildFF
{
echo "开始编译ffmpeg"
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--arch=aarch64 \
--cpu=armv8-a \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAG" \
#x264编译安装后的头文件路径
--extra-cflags="-I/root/x264-master-test/static/armv64-v8a/include " \
#x264编译安装后的库文件路径
--extra-ldflags="-L/root/x264-master-test/static/armv64-v8a/lib " \
--enable-shared \
--enable-runtime-cpudetect \
--enable-small \
--enable-cross-compile \
--enable-static \
--enable-libx264 \
--enable-gpl \
--disable-asm \
--disable-debug \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j16
echo "编译结束"
}
###########################################################
echo "编译不支持neon和硬解码"
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp"
buildFF