Compiler la version FFmpeg5.0 64 bits basée sur NDK 24 sous Ubuntu 20

avant-propos

Cet article est un résumé de quelques méthodes et pit records lorsque j'ai compilé FFmpeg. Il y a plus ou moins de problèmes avec les scripts de compilation utilisés dans de nombreux tutoriels sur Internet. Je fais principalement quelques optimisations sur la base des prédécesseurs. Les questions sont les bienvenues discuter

Configuration de l'environnement

Je n'en dirai pas plus à ce sujet.
Système d'exploitation : Ubuntu 20.04.4
NDK r24
FFmpeg 5.0
ndk Je l'ai téléchargé directement via Android Studio, ou il peut être téléchargé séparément.
Ensuite, je dois configurer l'environnement NDK. C'est aussi relativement simple, mais je vais entrer dans les détails.

vim etc/profile
#输入你自己的ndk路径
export NDK_HOME=/Android/Sdk/ndk/24.0.8215888
复制代码

test:

ndk-build -v
复制代码

L'invite suivante s'affiche pour indiquer la réussite :

20220408104816.pngEn cas d'échec, vous devrez peut-être accorder des autorisations de dossier :

chmod 751 -r 目录名称
复制代码

Compiler FFmpeg

Allez sur le site officiel pour télécharger la version 5.0, décompressez-la et autorisez le changement de répertoire. Après cela, nous commençons à écrire le script de compilation
. Exécutez la commande :

vim ffbuild.sh
复制代码

Entrez ce qui suit :

#!/bin/bash

#此处 NDK_HOME 为环境变量
#我的路径是 /Android/Sdk/ndk/24.0.8215888
NDK_ROOT=$NDK_HOME

echo "<<<<<<<<<<<<<基于NDK24编译 FFmpeg 5.0 64位硬件解码版本>>>>>>>>>>>>>>"

#设置编译平台的相关参数
CPU=armv8-a
ARCH=arm64
OS=android
PLATFORM=aarch64-linux-android
OPTIMIZE_CFLAGS="-march=$CPU"


#指定输出路径
PREFIX=$(pwd)/android/aarch64
#此处 TOOLCHAIN 为环境变量
#我的路径是 /Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
#CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM}21-


echo "开始编译 $CPU"
#该脚本命令中不能插入注释,每行命令必须以 \ 结尾
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-gpl \
--enable-neon \
--enable-hwaccels \
--enable-postproc \
--enable-jni \
--enable-small \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffplay \
--disable-avdevice \
--disable-debug \
--disable-static \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=$OS \
--arch=$ARCH \
--cpu=$CPU \
--cc=${ANDROID_CROSS_PREFIX}clang \
--cxx=${ANDROID_CROSS_PREFIX}clang++ \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fPIC $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \

make clean
#编译
make
#安装
make install

echo "编译完成 $CPU"
复制代码

Avant de l'utiliser, vous devez remplacer le chemin spécifié par le script par votre propre chemin ndk. Après cela, il est préférable de s'assurer que gcc et yasm ont été installés sur votre système (ceux qui sont installés peuvent être ignorés) et d'exécuter le commande suivante :

#更新
sudo apt-get update
#安装工具包
sudo apt-get install yasm 
sudo apt-get install build-essential
复制代码

Voici quelques remarques sur le script :
1. Le chemin doit être modifié par le chemin sous votre propre ndk
2. Les paramètres de configuration de ./configure peuvent être définis en fonction de vos propres besoins. Plus précisément, vous pouvez cliquer sur le dossier après décompression de ffmpeg 3. Si vous avez
besoin de compiler la version 32 bits, modifiez les paramètres correspondants

ARCH=arm 
CPU=armv7-a 
PLATFORM=armv7a-linux-androideabi
PREFIX=$(pwd)/android/$CPU 
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
复制代码

exécuter le script

Placez le script dans le répertoire ffmpeg et exécutez la commande pour exécuter

sh ffbuild.sh
复制代码

Ensuite, il commencera à compiler ffmpeg

Fosses rencontrées lors de la compilation

1、xxxx-clang est incapable de créer un fichier exécutable.

20220408114232.png
Il s'agit généralement d'un problème de chemin, assurez-vous de vérifier si la configuration du chemin est correcte

2. -- Commande XX : introuvable

20220408114654.png
Vérifiez si la commande dans le script \se termine par , ou s'il y a d'autres caractères inutiles dans la commande
3, ./configre : xxxxxxx-nm not found ou xxxx-strip not found, etc.

20220408115058.png

20220408120018.pngLorsque quelque chose comme ci-dessus apparaît, nous pouvons observer qu'il n'y a pas d'outil correspondant dans le chemin qu'il imprime, mais nous pouvons trouver des llvmoutils avec des préfixes dans le répertoire, tels que llvm-nm, llvm-stripetc. Les préfixes de ces outils sont spécifiés par la --cross-prefix=commande . De nombreux scripts sur Internet utilisent des préfixes tels que armv7a-linux-android, qui ne doivent pas être trouvés. Cela devrait être la pratique de la version précédente, donc je l'ai changé en ceci dans le script de compilation que j'ai donné $TOOLCHAIN/bin/llvm-, donc il n'y a pas de problème. .
Bien sûr, si untel introuvable apparaît toujours, nous pouvons également spécifier le chemin de l'outil séparément,
comme xxx-strip not found, nous pouvons ajouter une instruction pour spécifier le chemin de l'outil de bande, comme suit :

STRIP=$TOOLCHAIN/bin/bin/llvm-strip
./configure \
.... \
--strip=$STRIP \
复制代码

Résumer

Cet article n'est que quelques modifications et optimisations apportées sur la base des prédécesseurs et de quelques pit records. Si vous avez besoin d'une introduction plus détaillée, vous pouvez vous rendre sur la compilation # One-click du grand gars de FFmpeg 32/64 bits 4.2.2

Je suppose que tu aimes

Origine juejin.im/post/7084122050456977444
conseillé
Classement