FFmpeg 编译支持 neon 和 硬编解码

Posted 胡刚2021

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg 编译支持 neon 和 硬编解码相关的知识,希望对你有一定的参考价值。

参考环境搭建博客:
android平台的neon优化策略
Android Studio的ARM Neon学习环境搭建

neon 学习资料:
https://www.yuque.com/docs/share/3eff70c4-c70f-40df-b0af-df9fa7365d3c?#

代码链接:
FFmpeg 播放器使用 neon 加速 demo

环境:Ubuntu 20 + android Studio Artic Fox + JDK11 + Gradle 7.0.2 + NDK 21(我的 Android Studio 使用的是 NDK 21,编译脚本使用的是 NDK 20)

1.下载工具

sudo apt-get install make
sudo apt-get install gedit
sudo apt-get install git

2.下载源码,强烈建议使用git

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

如果 git 卡住了,可以ctrl + C 然后多次尝试

3.切换分支到 remotes/origin/release/4.2
其他的分支可能不行

git checkout -b remotes/origin/release/4.2

4.下载NDK r20b
这个版本可以编译成功,其他的可能要修改脚本

wget https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip

以往NDK版本下载链接

5.解压ndk

unzip android-ndk-r20b-linux-x86_64.zip

6.编写build.sh
注意:你的NDK路径要写你自己的

#!/bin/bash
NDK=/home/hg/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21

ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU "

echo "============= build for android $CPU ============="
./configure \\
    --prefix=$PREFIX \\
    --enable-small \\
    --enable-cross-compile \\
    --enable-shared \\
    --enable-asm \\
    --enable-neon \\
    --enable-jni \\
    --enable-mediacodec \\
    --disable-static \\
    --disable-doc \\
    --enable-nonfree \\
    --enable-gpl \\
    --cross-prefix=$CROSS_PREFIX \\
    --target-os=android \\
    --arch=$ARCH \\
    --cpu=$CPU \\
    --cc=$CC
    --cxx=$CXX
    --sysroot=$SYSROOT \\
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \\
    --extra-ldflags="$ADDI_LDFLAGS" \\
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
echo "============= build for android $CPU completed ============="

7.给 build.sh 加权限

sudo chmod +777 build.sh

8.执行编译脚本

sudo sh build.sh

编译完成后,会在 ffmpeg 目录下生成 android/armv7-a 目录,里面有 include lib shared文件夹
将 include 和 lib 这两个文件夹拷贝出来,放到Android Studio 项目里的 cpp 目录下,在 Android Studio 将 lib 文件夹改名成 libs

9.配置 build.gradle
build.gradle

externalNativeBuild 
    cmake 
         cppFlags ""
         abiFilters 'armeabi-v7a'
         arguments '-DANDROID=c++_shared',"-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang -mfloat-abi=softfp -mfpu=neon"
     
 

因为这里在 build.gradle 中已经给 CMake 传了开启 neon 的参数,所以 CMakeLists.txt 就不用设置了
实测解码性能提高为如下所示,有的帧会比原来高很多

遇到的问题:
使用 NDK R20b,FFmpeg如果的版本不是4.2的话,在Android Studio报错:
av_register_all 和 av_frame_get_best_effort_timestamp 未定义,实际上这两个函数已经被废弃了。

以上是关于FFmpeg 编译支持 neon 和 硬编解码的主要内容,如果未能解决你的问题,请参考以下文章

H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持

mips uclibc 交叉编译ffmpeg,支持 G711A 编解码

RK3588芯片支持8K视频的硬编解码

ffmpeg neon 在 android 上编译 - 汇编错误

Linux下NDK编译FFMPEG包含neon参数

mips uclibc 交叉编译ffmpeg,支持 G711A 编解码