En esta página

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-audiotoolbox

Los 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
done

Creació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

Incrustar frameworks en una aplicación.

© 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.