macOS에서 iOS용 소스에서 FFmpeg 빌드하기
이 페이지에서는 iOS용 FFmpeg를 프레임워크로 구성하고 빌드하는 방법을 설명합니다. iOS용 컴파일은 교차 컴파일이며 macOS를 호스트 시스템으로 사용하는 것을 전제로 합니다. 필요한 단계는 다음과 같습니다:
- 빌드 환경 준비하기
- FFmpeg 소스 코드 가져오기
- 명령줄에서 FFmpeg 구성하기
- 동적 라이브러리 빌드하기
- FFmpeg 라이브러리에서 iOS 프레임워크 생성하기
- XC프레임워크 생성하기
- 프레임워크 임베딩하기
참고: 다음 문서에서는 ~/ffmpeg
에서 FFmpeg 라이브러리 및 코드로 작업한다고 가정합니다.
빌드 환경 준비하기
iOS용 빌드 환경은 도구 체인(컴파일러, 링커 및 기타 도구)과 빌드 및 링크하는 iOS 플랫폼-SDK(헤더 및 라이브러리)를 포함하는 Apple의 Xcode 애플리케이션에서 제공합니다.
FFmpeg 소스 코드 얻기
다음과 같은 방법으로 FFmpeg 소스 코드를 얻을 수 있습니다:
- FFmpeg 다운로드 페이지에서 다운로드합니다.
- git에서 복제. 예를 들어, 다음 명령은 FFmpeg 소스 버전 7.1을
~/ffmpeg/ffmpeg_src
에 복제합니다.% cd ~/ffmpeg/ % git clone --branch n7.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg_src
참고: Qt Multimedia 메인 페이지에 설명된 것과 동일한 FFmpeg 버전을 사용하는 것이 좋습니다.
FFmpeg 구성 및 빌드
~/ffmpeg
디렉터리 내에 build
및 installed
디렉터리를 생성하고 build
로 이동합니다:
% mkdir ~/ffmpeg/build % mkdir ~/ffmpeg/installed % cd ~/ffmpeg/build
FFmpeg를 구성하려면 실행합니다:
% ../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-ldflags="-miphoneos-version-min=16.0" \ --install-name-dir='@rpath' \ --disable-audiotoolbox
명령줄 프로그램과 설명서는 필요하지 않으며 네트워크 기능이 활성화되어 있어야 합니다. 공유 라이브러리를 빌드하며 정적 라이브러리는 필요하지 않습니다(정적 라이브러리를 빌드하려면 --disable-static
생략). --sysroot
은 교차 빌드 트리의 루트를 지정합니다. --prefix
인수는 빌드 후 FFmpeg 라이브러리가 설치되는 경로를 지정합니다. --extra-ldflags
은 iOS의 최소 버전을 설정합니다. --install-name-dir
은 설치된 타겟에 대한 Apple 플랫폼의 공유 라이브러리 "install_name" 필드에서 디렉터리 부분을 지정하는 문자열입니다. FFmpeg는 iOS에서 사용할 수 없는 AudioToolBox 프레임워크의 일부를 사용하기 때문에 AudioToolBox가 비활성화됩니다.
참고: 위의 예에서 'iphoneos'를 'iphonesimulator'로, 'miphoneos-version'을 'mios-simulator-version-min'으로 바꾸면 FFmpeg가 iOS 시뮬레이터에 적합한 라이브러리로 빌드되도록 구성할 수 있습니다.
다른 구성 옵션에 대한 도움말을 보려면 실행하세요:
% ../ffmpeg_src/configure --help
구성이 완료되면 FFmpeg 라이브러리를 빌드합니다:
% make -j install
FFmpeg 라이브러리에서 iOS 프레임워크 만들기
iOS 애플리케이션에서 작동하려면 FFmpeg 동적 라이브러리를 프레임워크로 변환하여 애플리케이션 번들에 임베드해야 합니다. 프레임워크는 동적 라이브러리, 이미지 파일, 지역화된 문자열, 헤더 파일, 참조 문서 등의 리소스를 단일 패키지로 캡슐화하는 계층적 디렉터리입니다. 저희의 경우 FFmpeg 프레임워크에는 동적 라이브러리와 해당 Info.plist 파일만 포함되어 있습니다. 예를 들어 프레임워크로 변환된 libavcodec은 이러한 내용이 포함된 libavcodec.framework
디렉터리가 됩니다:
- Info.plist(프레임워크에 대한 설명 포함)
- libavcodec(동적 라이브러리)
이전 단계에서 빌드한 동적 라이브러리와 달리 iOS 프레임워크 내의 동적 라이브러리는 버전이 변환되지 않았으며 'dylib' 확장자가 없습니다. 따라서 동적 라이브러리에서 라이브러리 식별 이름과 종속성을 수정해야 합니다. otool
유틸리티는 이러한 이름을 찾는 데 도움이 됩니다. 예를 들어
%otool -L ../installed/lib/libavcodec.dylib
은 이러한 이름을 제공합니다(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)
이러한 이름을 수정하려면 install_name_tool
유틸리티를 사용합니다. 유틸리티 옵션은 다음과 같습니다:
-id
- 공유 라이브러리 식별 이름을 변경할 수 있습니다.-change
- 종속 공유 라이브러리 설치 이름을 변경할 수 있습니다.
이 스크립트는 이전에 빌드한 동적 라이브러리를 프레임워크로 변환합니다. 이 코드는 build
디렉토리에서 실행하고 프레임워크는 ~/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
멀티플랫폼 바이너리 프레임워크 번들 만들기
XCFramework 번들은 여러 플랫폼(예: iOS 및 iOS 시뮬레이터)용 빌드에 필요한 프레임워크 및 라이브러리가 포함된 패키지입니다. 이러한 프레임워크를 만들려면 xcodebuild
유틸리티를 사용합니다. 예를 들어 ~/ffmpeg/installed/arm64
및 ~/ffmpeg/installed/arm64-simulator
디렉터리에 iOS 및 시뮬레이터용 프레임워크가 있는 경우 유틸리티 인수는 다음과 같습니다:
%xcodebuild -create-xcframework -framework ../installed/arm64/libavcodec.framework -framework ../installed/arm64-simulator/libavcodec.framework -output ../installed/framework/libavcodec.xcframework
프레임워크 임베딩하기
FFmpeg 프레임워크를 애플리케이션 번들에 임베드합니다. XCode를 사용하여 프레임워크를 임베드하는 방법에 대한 자세한 내용은 다음을 참조하십시오.
앱에 프레임워크 임베드하기를 참조하세요.
© 2025 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.