使用NDK在Ubuntu16.01.12交叉编译FFmpeg+X264

FFmpeg 在linux下编译后默认是不包含H264编码器(也就是x264)的
如果需要在安卓下使用FFmpeg进行h264解码可以直接下载 FFmpeg源码编译即可。
如需使用FFmpeg 进行h264编码 则需先下载x264源码使用NDK交叉编译出x264的静态库文件

1.下载NDK

下载地址:不受支持的 NDK 下载 | Android NDK | Android Developers (google.cn)
版本:修订版 14b (r14b)

1.jpg

下载完成后上传到Ubuntu的用户目录下,进行解压后即可。

2.下载x264源码,编译动态链接库

下载地址:x264, the best H.264/AVC encoder - VideoLAN

2.jpg

下载完成后上传到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

5.jpg

下载完成后上传到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
3.4 执行make install 进行安装
6.jpg

你可能感兴趣的:(使用NDK在Ubuntu16.01.12交叉编译FFmpeg+X264)