FFmpeg 编译支持 neon

本文档详细介绍了如何在Ubuntu20上搭建Android Studio Artic Fox的ARM NEON学习环境,用于FFmpeg播放器的NEON加速。步骤包括安装必要工具、下载FFmpeg源码、切换到特定分支、下载NDK r20b、编写并执行编译脚本,以及配置Android Studio的build.gradle。通过此方法,可以解决因FFmpeg版本不匹配导致的av_register_all和av_frame_get_best_effort_timestamp未定义问题,实测能显著提高解码性能。

参考环境搭建博客:
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版本下载链接
非最新版本的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 未定义,实际上这两个函数已经被废弃了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值