Creación de FFmpeg desde el código fuente para iOS en macOS
Esta página explica cómo configurar y compilar FFmpeg para iOS como frameworks. La compilación para iOS es una compilación cruzada y presupone el uso de macOS como sistema anfitrión. Los pasos necesarios son:
- Preparar el entorno de compilación
- Obtener el código fuente de FFmpeg
- Configurar FFmpeg desde la línea de comandos
- Creación de bibliotecas dinámicas
- Creación de frameworks iOS a partir de las librerías FFmpeg
- Creación de XCFrameworks
- Incrustación de frameworks
Nota: La siguiente documentación asume que trabajas con bibliotecas FFmpeg y código bajo ~/ffmpeg.
Preparación del entorno de compilación
El entorno de compilación para iOS lo proporciona la aplicación Xcode de Apple, que incluye la cadena de herramientas (compilador, enlazador y otras herramientas) y el SDK de la plataforma iOS (cabeceras y bibliotecas) con el que se compila y enlaza.
Cómo obtener el código fuente de FFmpeg
Puedes obtener el código fuente de FFmpeg de las siguientes maneras:
- Descárgalo desde la página de descargas de FFmpeg.
- Clonar desde git. Por ejemplo, estos comandos clonan la versión 7.1.3 de las fuentes de FFmpeg a
~/ffmpeg/ffmpeg_src.cd ~/ffmpeg/ git clone --branch n7.1.3 https://git.ffmpeg.org/ffmpeg.git ffmpeg_src
Nota: Se recomienda utilizar la misma versión de FFmpeg que la documentada en la página principalQt Multimedia .
Configurar y construir FFmpeg
Crea los directorios build y installed dentro del directorio ~/ffmpeg y navega a build:
mkdir ~/ffmpeg/build mkdir ~/ffmpeg/installed cd ~/ffmpeg/build
Para configurar FFmpeg, ejecute:
../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-audiotoolboxLos programas de línea de comandos y la documentación no son necesarios; las funciones de red deben estar habilitadas. Construimos bibliotecas compartidas y no necesitamos bibliotecas estáticas (omita --disable-static para construir bibliotecas estáticas). --sysroot especifica la raíz del árbol de construcción cruzada. El argumento --prefix especifica una ruta en la que se instalan las bibliotecas FFmpeg después de la compilación. Construimos en macOS host para el objetivo iOS por lo que habilitamos la compilación cruzada. --extra-ldflags establece la versión mínima de iOS. --install-name-dir es una cadena que especifica la parte del directorio del campo "install_name" de las bibliotecas compartidas en plataformas Apple para objetivos instalados. AudioToolBox está desactivado, ya que FFmpeg utiliza partes del framework AudioToolBox que no están disponibles en iOS.
Nota: En el ejemplo anterior, al sustituir "iphoneos" por "iphonesimulator", y "miphoneos-version" por "mios-simulator-version-min", se configura FFmpeg para que se construya con las bibliotecas adecuadas para el simulador de iOS.
Para obtener ayuda sobre otras opciones de configuración, ejecuta:
../ffmpeg_src/configure --help
Una vez finalizada la configuración, crea las bibliotecas FFmpeg:
make -j install
Creación de frameworks iOS a partir de las bibliotecas FFmpeg
Para funcionar en aplicaciones iOS, las bibliotecas dinámicas FFmpeg deben convertirse en frameworks e incrustarse en paquetes de aplicaciones. Un framework es un directorio jerárquico que encapsula recursos como una librería dinámica, archivos de imagen, cadenas localizadas, archivos de cabecera y documentación de referencia en un único paquete. En nuestro caso, los frameworks de FFmpeg sólo contienen bibliotecas dinámicas y los correspondientes archivos Info.plist. Por ejemplo, libavcodec convertida en framework se convierte en el directorio libavcodec.framework con estos contenidos:
- Info.plist (contiene la descripción del framework)
- libavcodec (biblioteca dinámica)
A diferencia de las bibliotecas dinámicas que construimos en el paso anterior, las bibliotecas dinámicas dentro de los frameworks de iOS no están versionadas y no tienen extensiones 'dylib'. Esto requiere fijar los nombres de identificación de las bibliotecas y las dependencias en nuestras bibliotecas dinámicas. La utilidad otool nos ayuda a encontrar dichos nombres. Por ejemplo
otool -L ../installed/lib/libavcodec.dylib
nos da estos nombres (sólo mostramos los relacionados con 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)
Para arreglar estos nombres, utilice la utilidad install_name_tool. Las opciones de la utilidad son:
-id- permite cambiar el nombre de identificación de la biblioteca compartida.-change- permite cambiar el nombre de instalación de la biblioteca compartida dependiente.
Este script convierte las bibliotecas dinámicas previamente construidas en frameworks. El código asume que se ejecuta desde el directorio build y que los frameworks se encuentran en ~/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
doneCreación de un paquete binario multiplataforma de frameworks
Un paquete XCFramework es un paquete que incluye frameworks y librerías necesarias para construir para múltiples plataformas, por ejemplo, iOS y el simulador iOS. Para crear un framework de este tipo, utilice la utilidad xcodebuild. Por ejemplo, si tiene frameworks para iOS y simulador ubicados en los directorios ~/ffmpeg/installed/arm64 y ~/ffmpeg/installed/arm64-simulator, los argumentos de la utilidad tienen el siguiente aspecto:
xcodebuild -create-xcframework -framework ../installed/arm64/libavcodec.framework -framework ../installed/arm64-simulator/libavcodec.framework -output ../installed/framework/libavcodec.xcframework
Incrustación de frameworks
Incrusta los frameworks FFmpeg en un paquete de aplicaciones. Para obtener información sobre cómo incrustar frameworks utilizando XCode, consulte
© 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.