Linux 및 Android의 FFmpeg 스텁 라이브러리

개요

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

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

  • OpenSSL - 보안 네트워크 스트리밍에 필요합니다.
  • VAAPI (Linux 전용) - 하드웨어 가속 동영상 디코딩 및 인코딩을 활성화합니다.

이러한 라이브러리는 라이선스 제약으로 인해 사용할 수 없거나 번들로 제공되지 않는 경우가 많습니다. 지원되지 않는 부분을 제외하고 FFmpeg 기반 기능이 계속 작동하도록 하기 위해 Qt는 스텁 라이브러리를 폴백으로 제공합니다.

스텁이 필요한 이유

이러한 종속성이 런타임에 존재하지 않으면 FFmpeg가 로드되지 않거나 제대로 작동하지 않습니다. 스텁 메커니즘이 이를 허용합니다:

  • OpenSSL 또는 VAAPI가 누락된 경우에도 FFmpeg를 성공적으로 로드할 수 있습니다.
  • 기능의 점진적인 저하(예: VAAPI가 없어도 하드웨어 가속이 되지 않지만 재생은 계속 작동).
  • 가능한 경우 사용자가 시스템에서 제공하는 자체 라이브러리 버전을 사용하도록 옵트인할 수 있습니다.

스텁이란?

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

  • 안전한 폴백 값 또는 무작동을 반환하는 더미 구현을 제공합니다.
  • 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는 명시적으로 지원되지 않음)
  • 호환성은 FFmpeg 구성에 따라 다르지만 OpenSSL 1.x.x에 대해 Qt Multimedia 를 빌드할 수도 있습니다.

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

  • patchelf 을 사용하여 FFmpeg의 종속성을 시스템 라이브러리로 복원합니다(예: libQt6FFmpegStub-ssl.so.3libssl.so.3 으로 대체). 이 작업은 모든 FFmpeg 라이브러리에 대해 수행해야 합니다: libavcodec, libavformat, libavutil, libswresample, 그리고 libswscale 입니다.
  • 제공된 FFmpeg 라이브러리를 사용자가 수동으로 빌드한 라이브러리로 교체합니다. 소스에서 FFmpeg 빌드하기를 참조하세요.

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