Construire FFmpeg à partir des sources pour iOS sur macOS
Cette page explique comment configurer et construire FFmpeg pour iOS en tant que frameworks. La compilation pour iOS est une compilation croisée et suppose l'utilisation de macOS comme système hôte. Les étapes nécessaires sont les suivantes :
- Préparer l'environnement de compilation
- Obtenir le code source de FFmpeg
- Configurer FFmpeg à partir de la ligne de commande
- Construire des bibliothèques dynamiques
- Créer des frameworks iOS à partir des bibliothèques FFmpeg
- Créer des XCFrameworks
- Intégrer des frameworks
Note : La documentation suivante suppose que vous travaillez avec les bibliothèques et le code FFmpeg sous ~/ffmpeg.
Préparation de l'environnement de compilation
L'environnement de construction pour iOS est fourni par l'application Xcode d'Apple, qui comprend la chaîne d'outils (compilateur, éditeur de liens et autres outils) et le SDK de la plateforme iOS (en-têtes et bibliothèques) que vous construisez et liez.
Obtenir le code source de FFmpeg
Vous pouvez obtenir le code source de FFmpeg de plusieurs façons :
- Télécharger depuis la page de téléchargement de FFmpeg.
- Cloner à partir de git. Par exemple, ces commandes clonent la version 7.1.3 des sources de FFmpeg sur
~/ffmpeg/ffmpeg_src.cd ~/ffmpeg/ git clone --branch n7.1.3 https://git.ffmpeg.org/ffmpeg.git ffmpeg_src
Note : Il est recommandé d'utiliser la même version de FFmpeg que celle documentée dans la page principale deQt Multimedia .
Configurer et compiler FFmpeg
Créez les répertoires build et installed à l'intérieur du répertoire ~/ffmpeg et naviguez dans 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-audiotoolboxLes programmes de ligne de commande et la documentation ne sont pas nécessaires ; les fonctions réseau doivent être activées. Nous construisons des bibliothèques partagées et n'avons pas besoin de bibliothèques statiques (omettre --disable-static pour construire des bibliothèques statiques). --sysroot spécifie la racine de l'arbre de construction croisée. L'argument --prefix spécifie un chemin où les bibliothèques FFmpeg sont installées après la compilation. Nous construisons sur macOS host pour la cible iOS afin d'activer la compilation croisée. --extra-ldflags définit la version minimale d'iOS. --install-name-dir est une chaîne spécifiant la partie répertoire du champ "install_name" des bibliothèques partagées sur les plates-formes 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.
Note : Dans l'exemple ci-dessus, remplacer 'iphoneos' par 'iphonesimulator', et 'miphoneos-version' par 'mios-simulator-version-min', configure FFmpeg pour qu'il soit construit avec des 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, construire les bibliothèques FFmpeg :
make -j install
Créer des frameworks iOS à partir des bibliothèques FFmpeg
Pour fonctionner dans des applications iOS, les bibliothèques dynamiques FFmpeg doivent être converties en frameworks et incorporées dans des bundles d'applications. Un framework est un répertoire hiérarchique qui encapsule des ressources telles qu'une bibliothèque dynamique, des fichiers images, des chaînes localisées, des fichiers d'en-tête et de la documentation de référence dans un seul paquet. Dans notre cas, les frameworks FFmpeg ne contiennent que des bibliothèques dynamiques et les fichiers Info.plist correspondants. Par exemple, libavcodec converti en framework devient le répertoire libavcodec.framework avec les contenus suivants :
- Info.plist (contenant la description du framework)
- libavcodec (bibliothèque dynamique)
Contrairement aux bibliothèques dynamiques que nous avons construites à l'étape précédente, les bibliothèques dynamiques à l'intérieur des frameworks iOS ne sont pas versionnées et n'ont pas d'extension 'dylib'. Cela nécessite de corriger les noms d'identification des bibliothèques et les dépendances dans nos bibliothèques dynamiques. L'utilitaire otool nous aide à trouver ces noms. Par exemple :
otool -L ../installed/lib/libavcodec.dylib
nous donne ces noms (nous n'affichons 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 l'utilitaire sont les suivantes :
-id- permet de changer 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 construites en frameworks. Le code suppose que vous l'exécutez à partir du répertoire build et que les frameworks sont situés 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>7.0.2</string>
<key>CFBundleVersion</key>
<string>7.0.2</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
doneCréation d'un bundle de frameworks binaires multiplateformes
Un bundle XCFramework est un paquet qui inclut les frameworks et les bibliothèques nécessaires pour construire pour plusieurs plateformes, par exemple, iOS et le simulateur iOS. Pour créer un tel framework, utilisez l'utilitaire xcodebuild. Par exemple, si les frameworks pour iOS et le simulateur se trouvent 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égrer les frameworks
Incorporez les frameworks FFmpeg dans un bundle d'application. Pour plus d'informations sur l'intégration des frameworks à l'aide de XCode, voir
© 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.