FFmpeg aus dem Quellcode für iOS unter macOS kompilieren
Auf dieser Seite wird erläutert, wie man FFmpeg für iOS als Frameworks konfiguriert und kompiliert. Die Kompilierung für iOS erfolgt als Cross-Kompilierung und setzt die Verwendung von macOS als Host-System voraus. Die erforderlichen Schritte sind:
- Laden Sie den FFmpeg-Quellcode herunter.
- Installieren Sie die erforderlichen Abhängigkeiten.
- Konfigurieren Sie FFmpeg über die Befehlszeile.
- Erstellen Sie die Entwicklungsbibliotheken.
- Erstellen Sie iOS-Frameworks aus den FFmpeg-Bibliotheken.
- Erstellen Sie XCFrameworks.
- Betten Sie die Frameworks in ein Anwendungs-Bundle ein.
Den FFmpeg-Quellcode beziehen
Sie können den FFmpeg-Quellcode auf folgende Weise beziehen:
- Laden Sie ihn von der FFmpeg-Download-Seite herunter.
- Klonen Sie den Code aus Git. Mit diesem Befehl wird beispielsweise die Version 9.0.1 der FFmpeg-Quellcodes nach
~/ffmpeggeklont.git clone --branch n9.0.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg
Es wird empfohlen, dieselbe FFmpeg-Version zu verwenden, die auf der Hauptseite vonQt Multimedia dokumentiert ist.
In den folgenden Abschnitten wird davon ausgegangen, dass Sie den FFmpeg-Quellcode unter ~/ffmpeg ablegen.
Voraussetzungen
Zum Erstellen von FFmpeg sind folgende Tools und Pakete erforderlich:
- Xcode, das die Toolchain (Compiler, Linker und andere Werkzeuge) sowie das iOS-Plattform-SDK (Header und Bibliotheken) bereitstellt, mit denen Sie kompilieren und verknüpfen.
Konfigurieren und Kompilieren von FFmpeg
Erstellen Sie im Verzeichnis „ ~/ffmpeg “ die Verzeichnisse „ build “ und „ installed “ und wechseln Sie in das Verzeichnis „ build “:
mkdir ~/ffmpeg/build
mkdir ~/ffmpeg/installed
cd ~/ffmpeg/buildUm FFmpeg zu konfigurieren, führen Sie folgenden Befehl aus:
../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-audiotoolboxDie Befehlszeilenprogramme und die Dokumentation werden nicht benötigt; Netzwerkfunktionen sollten aktiviert sein. Wir erstellen gemeinsam genutzte Bibliotheken und benötigen keine statischen Bibliotheken (lassen Sie „ --disable-static “ weg, um statische Bibliotheken zu erstellen). „ --sysroot “ gibt das Stammverzeichnis des Cross-Build-Baums an. Das Argument „ --prefix “ gibt einen Pfad an, in dem die FFmpeg-Bibliotheken nach dem Erstellen installiert werden. Da wir auf einem macOS-Host für das iOS-Ziel kompilieren, aktivieren wir die Cross-Kompilierung. „ --extra-ldflags “ legt die Mindestversion von iOS fest. „ --install-name-dir “ ist eine Zeichenkette, die den Verzeichnisanteil des Feldes „install_name“ von gemeinsam genutzten Bibliotheken auf Apple-Plattformen für installierte Ziele angibt. AudioToolBox ist deaktiviert, da FFmpeg Teile des AudioToolBox-Frameworks verwendet, die unter iOS nicht verfügbar sind.
Hinweis: Im obigen Beispiel führt das Ersetzen von „iphoneos“ durch „iphonesimulator“ und von „miphoneos-version“ durch „mios-simulator-version-min“ dazu, dass FFmpeg so konfiguriert wird, dass es als für den iOS-Simulator geeignete Bibliotheken erstellt wird.
Um Hilfe zu weiteren Konfigurationsoptionen zu erhalten, führen Sie folgenden Befehl aus:
../ffmpeg_src/configure --helpNachdem die Konfiguration abgeschlossen ist, erstellen Sie die FFmpeg-Bibliotheken:
make -j installErstellen von iOS-Frameworks aus FFmpeg-Bibliotheken
Um in iOS-Anwendungen zu funktionieren, müssen die dynamischen FFmpeg-Bibliotheken in Frameworks umgewandelt und in Anwendungs-Bundles eingebettet werden. Ein Framework ist eine hierarchische Verzeichnisstruktur, die Ressourcen wie dynamische Bibliotheken, Bilddateien, lokalisierte Zeichenfolgen, Header-Dateien und Referenzdokumentation in einem einzigen Paket zusammenfasst. In unserem Fall enthalten FFmpeg-Frameworks nur dynamische Bibliotheken und die dazugehörigen Info.plist-Dateien. Beispielsweise wird die in ein Framework konvertierte Bibliothek „libavcodec“ zum Verzeichnis „ libavcodec.framework “ mit folgendem Inhalt:
- Info.plist (enthält die Beschreibung des Frameworks)
- libavcodec (dynamische Bibliothek)
Im Gegensatz zu den dynamischen Bibliotheken, die wir im vorherigen Schritt erstellt haben, sind dynamische Bibliotheken in iOS-Frameworks nicht versioniert und haben keine „dylib“-Erweiterungen. Dies erfordert eine Anpassung der Identifikationsnamen und Abhängigkeiten in unseren dynamischen Bibliotheken. Das Dienstprogramm „ otool “ hilft uns dabei, solche Namen zu finden. Zum Beispiel:
otool -L ../installed/lib/libavcodec.dylibliefert uns folgende Namen (wir zeigen hier nur die Namen im Zusammenhang mit 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)Um diese Namen anzupassen, verwenden Sie das Dienstprogramm „ install_name_tool “. Die Optionen des Dienstprogramms sind:
-id- ermöglicht es, den Identifikationsnamen der gemeinsam genutzten Bibliothek zu ändern.-change- ermöglicht die Änderung des Installationsnamens der abhängigen gemeinsam genutzten Bibliothek.
Dieses Skript konvertiert die zuvor erstellten dynamischen Bibliotheken in Frameworks. Der Code geht davon aus, dass Sie es aus dem Verzeichnis „ build “ ausführen und sich die Frameworks unter „ ~/ffmpeg/installed/framework “ befinden:
#!/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
doneErstellen eines plattformübergreifenden Binär-Framework-Bundles
Ein XCFramework-Bundle ist ein Paket, das Frameworks und Bibliotheken enthält, die für die Erstellung auf mehreren Plattformen erforderlich sind, beispielsweise für iOS und den iOS-Simulator. Um ein solches Framework zu erstellen, verwenden Sie das Dienstprogramm „ xcodebuild “. Befinden sich beispielsweise Frameworks für iOS und den Simulator in den Verzeichnissen „ ~/ffmpeg/installed/arm64 “ und „ ~/ffmpeg/installed/arm64-simulator “, sehen die Argumente des Dienstprogramms wie folgt aus:
xcodebuild -create-xcframework -framework ../installed/arm64/libavcodec.framework -framework ../installed/arm64-simulator/libavcodec.framework -output ../installed/framework/libavcodec.xcframeworkEinbetten von Frameworks
Betten Sie die FFmpeg-Frameworks in ein Anwendungs-Bundle ein. Informationen zum Einbetten von Frameworks mit XCode finden Sie unter
© 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.