Sur cette page

Compiler FFmpeg à partir du code source pour iOS sous macOS

Cette page explique comment configurer et compiler FFmpeg pour iOS sous forme de frameworks. La compilation pour iOS est une compilation croisée et suppose l'utilisation de macOS comme système hôte. Les étapes requises sont les suivantes :

  • Procurez-vous le code source de FFmpeg.
  • Installez les dépendances requises.
  • Configurer FFmpeg depuis la ligne de commande.
  • Compiler les bibliothèques de développement.
  • Créer des frameworks iOS à partir des bibliothèques FFmpeg.
  • Créez des XCFrameworks.
  • Intégrez les frameworks dans un bundle d'application.

Obtenir le code source de FFmpeg

Vous pouvez obtenir le code source de FFmpeg de différentes manières :

  • Téléchargez-le depuis la page de téléchargement de FFmpeg.
  • Cloner depuis Git. Par exemple, cette commande clone la version 9.0.1 des sources de FFmpeg vers ~/ffmpeg.
    git clone --branch n9.0.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg

Il est recommandé d’utiliser la même version de FFmpeg que celle indiquée sur la page d’accueil deQt Multimedia .

Les paragraphes suivants partent du principe que vous stockez le code source de FFmpeg dans le répertoire ~/ffmpeg.

Prérequis

Pour compiler FFmpeg, les outils et paquets suivants sont requis :

  • Xcode, qui fournit la chaîne d'outils (compilateur, éditeur de liens et autres outils) ainsi que le SDK de la plateforme iOS (en-têtes et bibliothèques) à partir desquels vous effectuez la compilation et la liaison.

Configuration et compilation de FFmpeg

Créez les répertoires « build » et « installed » à l'intérieur du répertoire « ~/ffmpeg », puis accédez à « build » :

mkdir ~/ffmpeg/build
mkdir ~/ffmpeg/installed
cd ~/ffmpeg/build

Pour configurer FFmpeg, exécutez :

../ffmpeg_src/configure --disable-programs --disable-doc --enable-network --enable-shared --disable-static \
    --sysroot="$(xcrun --sdk iphoneos --show-sdk-path)" \
    --enable-cross-compile \
    --arch=arm64 \
    --prefix=../installed \
    --cc="xcrun --sdk iphoneos clang -arch arm64" \
    --cxx="xcrun --sdk iphoneos clang++ -arch arm64" \
    --extra-cflags="-miphoneos-version-min=16.0" \
    --extra-cxxflags="-miphoneos-version-min=16.0" \
    --extra-objcflags="-miphoneos-version-min=16.0" \
    --extra-ldflags="-miphoneos-version-min=16.0" \
    --install-name-dir='@rpath' \
    --disable-audiotoolbox

Les programmes en ligne de commande et la documentation ne sont pas nécessaires ; les fonctionnalités réseau doivent être activées. Nous compilons des bibliothèques partagées et n’avons pas besoin de bibliothèques statiques (omettez --disable-static pour compiler des bibliothèques statiques). --sysroot spécifie la racine de l’arborescence de compilation croisée. L’argument --prefix spécifie le chemin d’accès où les bibliothèques FFmpeg seront installées après la compilation. Nous effectuons la compilation sur un hôte macOS pour la cible iOS ; nous activons donc la compilation croisée. --extra-ldflags définit la version minimale d’iOS. --install-name-dir est une chaîne de caractères spécifiant la partie « répertoire » du champ « install_name » des bibliothèques partagées sur les plateformes Apple pour les cibles installées. AudioToolBox est désactivé, car FFmpeg utilise des parties du framework AudioToolBox qui ne sont pas disponibles sur iOS.

Remarque : dans l’exemple ci-dessus, en remplaçant « iphoneos » par « iphonesimulator » et « miphoneos-version » par « mios-simulator-version-min », on configure FFmpeg pour qu’il soit compilé sous forme de bibliothèques adaptées au simulateur iOS.

Pour obtenir de l’aide sur les autres options de configuration, exécutez :

../ffmpeg_src/configure --help

Une fois la configuration terminée, compilez les bibliothèques FFmpeg :

make -j install

Création de frameworks iOS à partir des bibliothèques FFmpeg

Pour fonctionner dans des applications iOS, les bibliothèques dynamiques FFmpeg doivent être converties en frameworks et intégrées dans les paquets d’application. Un framework est une structure de répertoires hiérarchique qui regroupe dans un seul paquet des ressources telles qu’une bibliothèque dynamique, des fichiers image, des chaînes localisées, des fichiers d’en-tête et de la documentation de référence. Dans notre cas, les frameworks FFmpeg ne contiennent que des bibliothèques dynamiques et les fichiers Info.plist correspondants. Par exemple, libavcodec, une fois converti en framework, devient le répertoire libavcodec.framework avec le contenu suivant :

  • Info.plist (contenant la description du framework)
  • libavcodec (bibliothèque dynamique)

Contrairement aux bibliothèques dynamiques que nous avons compilées à l’étape précédente, les bibliothèques dynamiques contenues dans les frameworks iOS ne sont pas versionnées et ne possèdent pas d’extension « dylib ». Cela nécessite de définir les noms d’identification et les dépendances de nos bibliothèques dynamiques. L’utilitaire otool nous aide à trouver ces noms. Par exemple :

otool -L ../installed/lib/libavcodec.dylib

nous fournit les noms suivants (nous n'affichons ici que les noms liés à FFmpeg) :

@rpath/libavcodec.61.dylib (compatibility version 61.0.0, current version 61.19.100)
@rpath/libswresample.5.dylib (compatibility version 5.0.0, current version 5.3.100)
@rpath/libavutil.59.dylib (compatibility version 59.0.0, current version 59.39.100)

Pour corriger ces noms, utilisez l’utilitaire ` install_name_tool `. Les options de cet utilitaire sont les suivantes :

  • -id - permet de modifier le nom d’identification de la bibliothèque partagée.
  • -change - permet de modifier le nom d’installation de la bibliothèque partagée dépendante.

Ce script convertit les bibliothèques dynamiques précédemment compilées en frameworks. Le code part du principe que vous l'exécutez depuis le répertoire « build » et que les frameworks se trouvent dans « ~/ffmpeg/installed/framework » :

#!/usr/bin/env bash

# Creates an Info.plist file for a given framework:
build_info_plist() {
    local file_path="$1"
    local framework_name="$2"
    local framework_id="$3"

    # Minimum version must be the same we used when building FFmpeg.
    local minimum_version_key="MinimumOSVersion"
    local minimum_os_version="16.0"

    local supported_platforms="iPhoneOS"

    info_plist="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>${framework_name}</string>
    <key>CFBundleIdentifier</key>
    <string>${framework_id}</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>${framework_name}</string>
    <key>CFBundlePackageType</key>
    <string>FMWK</string>
    <key>CFBundleShortVersionString</key>
    <string>9.0.1</string>
    <key>CFBundleVersion</key>
    <string>9.0.1</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>${minimum_version_key}</key>
    <string>${minimum_os_version}</string>
    <key>CFBundleSupportedPlatforms</key>
    <array>
        <string>${supported_platforms}</string>
    </array>
    <key>NSPrincipalClass</key>
    <string></string>
</dict>
</plist>"
    echo $info_plist | tee ${file_path} 1>/dev/null
}

dylib_regex="^@rpath/.*\.dylib$"

# Creates framework from a dylib file:
create_framework() {
    local framework_name="$1"
    local ffmpeg_library_path="../installed"
    local framework_complete_path="${ffmpeg_library_path}/framework/${framework_name}.framework/${framework_name}"

    # Create framework directory and copy dylib file to this directory:
    mkdir -p "${ffmpeg_library_path}/framework/${framework_name}.framework"
    cp "${ffmpeg_library_path}/lib/${framework_name}.dylib" "${ffmpeg_library_path}/framework/${framework_name}.framework/${framework_name}"

    # Change the shared library identification name, removing version number and 'dylib' extension;
    # \c Frameworks part of the name is needed since this is where frameworks will be installed in
    # an application bundle:
    install_name_tool -id @rpath/Frameworks/${framework_name}.framework/${framework_name} "${framework_complete_path}"

    # Add Info.plist file into the framework directory:
    build_info_plist "${ffmpeg_library_path}/framework/${framework_name}.framework/Info.plist" "${framework_name}" "io.qt.ffmpegkit."${framework_name}
    otool -L "$framework_complete_path" | awk '/\t/ {print $1}' | egrep "$dylib_regex" | while read -r dependency_path; do
        found_name=$(tmp=${dependency_path/*\/}; echo ${tmp/\.*})
        if [ "$found_name" != "$framework_name" ]
        then
            # Change the dependent shared library install name to remove version number and 'dylib' extension:
            install_name_tool -change "$dependency_path" @rpath/Frameworks/${found_name}.framework/${found_name} "${framework_complete_path}"
        fi
    done
}

ffmpeg_libs="libavcodec libavformat libavutil libswresample libswscale"

for name in $ffmpeg_libs; do
    create_framework $name
done

Création d’un bundle de frameworks binaires multiplateforme

Un ensemble XCFramework est un paquet comprenant les frameworks et les bibliothèques nécessaires à la compilation pour plusieurs plateformes, par exemple iOS et le simulateur iOS. Pour créer un tel framework, utilisez l’utilitaire xcodebuild. Par exemple, si vos frameworks pour iOS et le simulateur se trouvent respectivement dans les répertoires ~/ffmpeg/installed/arm64 et ~/ffmpeg/installed/arm64-simulator, les arguments de l’utilitaire se présentent comme suit :

xcodebuild -create-xcframework -framework ../installed/arm64/libavcodec.framework -framework ../installed/arm64-simulator/libavcodec.framework -output ../installed/framework/libavcodec.xcframework

Intégration de frameworks

Intégrez les frameworks FFmpeg dans un bundle d’application. Pour savoir comment intégrer des frameworks à l’aide de Xcode, consultez

Intégration de frameworks dans une application.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.