이 페이지에서

리눅스 및 안드로이드용 FFmpeg 스텁 라이브러리

개요

LGPL 라이선스에 따라 FFmpeg의 동적 링크를 지원하기 위해, Qt Multimedia 은 리눅스 및 안드로이드 플랫폼에서 선택적 외부 종속성을 처리하기 위해 스텁 라이브러리를 사용합니다.

이러한 플랫폼에서 FFmpeg는 Qt에 포함되어 있지 않은 추가 공유 라이브러리가 필요할 수 있습니다:

  • OpenSSL - 안전한 네트워크 스트리밍에 필요합니다.
  • VAAPI (리눅스 전용) - 하드웨어 가속 비디오 디코딩 및 인코딩을 가능하게 합니다.

이러한 라이브러리는 라이선스 제약으로 인해 종종 사용할 수 없거나 번들로 제공할 수 없는 경우가 있습니다. FFmpeg 기반 기능(지원되지 않는 부분 제외)이 계속 작동하도록 보장하기 위해, Qt는 대체 수단으로 스텁 라이브러리를 제공합니다.

스터브가 필요한 이유

실행 시점에 이러한 종속성이 없으면 FFmpeg이 로드되지 않거나 제대로 작동하지 않습니다. 스텁 메커니즘을 통해 다음이 가능합니다:

  • OpenSSL이나 VAAPI가 없더라도 FFmpeg을 성공적으로 로드할 수 있습니다.
  • 기능의 점진적 저하(예: VAAPI가 없으면 하드웨어 가속은 불가능하지만, 재생은 여전히 작동함).
  • 사용자가 시스템에서 제공하는 해당 라이브러리의 버전이 있는 경우, 이를 사용하도록 선택할 수 있습니다.

스터브란 무엇인가

스터브 라이브러리는 실제 라이브러리(예: libssl.so, libva.so)의 인터페이스를 모방하지만, 전체 기능을 구현하지는 않습니다. 대신 다음과 같은 역할을 합니다:

  • 안전한 대체 값이나 아무 작업도 수행하지 않는(no-op) 더미 구현을 제공합니다.
  • QLibrary::load / QLibrary::resolve 을 통해 실제 심볼을 동적으로 해결하려고 시도합니다.
  • 실제 라이브러리를 찾을 수 없는 경우 우아하게 오류를 처리합니다.

Qt는 이러한 스텁을 다음 이름으로 제공합니다:

  • libQt6FFmpegStub-ssl.so.x
  • libQt6FFmpegStub-crypto.so.x
  • libQt6FFmpegStub-va.so.x
  • libQt6FFmpegStub-va-drm.so.x
  • libQt6FFmpegStub-va-x11.so.x
  • (향후 더 추가될 수 있음)

Qt에서 스텁의 작동 방식

FFmpeg이 동적으로 링크될 때:

  • 일반적으로 libssl.so.3 나 libva.so.2 과 같은 시스템 라이브러리에 링크될 것으로 예상합니다.
  • Qt는 patchelf 도구를 사용하여 FFmpeg 바이너리에 패치를 적용함으로써, 이러한 실제 의존성을 스텁에 상응하는 요소로 대체합니다.

예시:

# Original linkage
libffmpegmediaplugin.so: needs libavcodec.so (depends on the FFmpeg libs)
libavcodec.so: needs libssl.so.3

# After patching
libffmpegmediaplugin.so: needs libavcodec.so (no changes)
libavcodec.so: needs libQt6FFmpegStub-ssl.so.3
libQt6FFmpegStub-ssl.so.3: optionally needs libssl.so.3 (no explicit linkage)

이러한 패치 작업은 빌드/배포 과정의 일환으로 자동으로 수행됩니다.

실행 시 동작 및 보안 관련 참고 사항

  • FFmpeg 플러그인은 dlopen(..., RTLD_LOCAL) 를 통해 로드되므로, 스텁 심볼이 전역 심볼 테이블로 유출되지 않습니다.
  • 애플리케이션이 이미 OpenSSL이나 VAAPI를 사용하는 경우, 시스템 라이브러리가 전역 범위에서 가져올 수 있으며 이 경우 바이너리 호환성이 보장되어야 합니다.
  • 제공되는 QtMultimedia 및 FFmpeg 바이너리는 다음 버전과 호환됩니다:
    • OpenSSL 3.x.x (심볼 버전 지정 방식: @OPENSSL_3.0.0)
    • VAAPI ABI 0.33 (이전 버전인 ABI 0.32는 명시적으로 지원되지 않음)

스터브 라이브러리 사용을 완전히 제거하려면 다음 두 가지 옵션이 있습니다:

  • patchelf 를 사용하여 FFmpeg의 종속성을 시스템 라이브러리로 되돌립니다(예: libQt6FFmpegStub-ssl.so.3 를 libssl.so.3 로 대체). 이 작업은 모든 FFmpeg 라이브러리( libavcodec, libavformat, libavutil, libswresample, libswscale)에 대해 수행해야 합니다.
  • 제공된 FFmpeg 라이브러리를 사용자가 직접 빌드한 라이브러리로 교체하십시오. ‘소스 코드로부터 FFmpeg 빌드하기’를 참조하십시오.

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