Qt Multimedia 지스트리머 백엔드
이 페이지에서는 임베디드 Linux의 기본 미디어 백엔드인 Qt Multimedia 의 GStreamer 백엔드의 제한 사항 및 사용자 지정 사항을 다룹니다.
아키텍처 고려 사항
대부분의 임베디드 보드 공급업체가 하드웨어 가속 미디어 지원을 위해 우선순위를 두는 프레임워크이기 때문에 임베디드 Linux의 기본 미디어 백엔드는 GStreamer입니다. FFmpeg도 일부 플랫폼에 적합할 수 있으므로 사용자는 두 가지 미디어 백엔드를 모두 실험하여 자신에게 가장 적합한 것을 찾는 것이 좋습니다.
Qt Multimedia 는 범용 스트리밍 프레임워크가 아니며, Qt와 함께 GStreamer를 사용하기 위한 구조적으로 가장 좋은 방법도 아닙니다. GStreamer 파이프라인에 대한 고도의 제어가 필요하지만 비디오 출력 Qt만 표시하려는 개발자는 GStreamer의 qml6glsink를 사용하는 것을 고려할 수 있습니다.
제한 사항 및 알려진 문제
GStreamer는 Qt와 함께 번들로 제공되지는 않지만, 일반적으로 Linux 배포판과 함께 배포됩니다.
- 특정 버그는 사용 중인 GStreamer 버전으로 인해 발생할 수 있습니다. 사용 중인 플랫폼에서 최신 GStreamer 버그 수정 릴리스를 사용하는 것이 좋습니다.
- 특정 버그는 Pulseaudio와 같이 GStreamer에서 사용하는 라이브러리와도 관련이 있을 수 있습니다. 특히 Pulseaudio v16에는 GStreamer 파이프라인을 중단시키는 알려진 버그가 있으며, 이 두 패치의 백포트가 필요합니다:
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/745
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/764
이 버그는 현재 우분투 22.04, 23.10 및 24.04, 데비안 11 및 12, 페도라 39 및 40을 포함한 대부분의 주요 Linux 배포판에 영향을 미칩니다.
- 녹화 중 카메라 장치 또는 카메라 전환이 지원되지 않습니다.
- 찾기, 재생 속도, 루프, 싱크 전환에 알려진 버그가 있습니다.
- 오디오 기능을 사용하려면 PulseAudio가 필요합니다. 자세한 내용은 Linux 플랫폼 노트를 참조하세요.
- 일부 임베디드 보드는 파이프라인 협상/연결 문제를 해결하고 성능을 개선하기 위해 개별 구성이 필요합니다. 이러한 문제가 발생하면 개발자는 사용자 지정 포인트에 나열된 환경 변수를 실험해 볼 것을 권장합니다. Qt의 Yocto 메타 레이어 파일에는 보드, BSP 및 Boot to Qt 버전의 특정 조합에 대한 권장 구성이 포함되어 있습니다. 다음은 개발 브랜치 버전에 대한 링크입니다:
- NXP i.MX 6/8/9: https://code.qt.io/cgit/yocto/meta-boot2qt.git/tree/meta-boot2qt-distro/dynamic-layers/freescale-layer/recipes-qt/boot2qt-addons/default-qt-envs.bbappend?h=dev
- 라즈베리 파이 4/5: https://code.qt.io/cgit/yocto/meta-boot2qt.git/tree/meta-boot2qt-distro/dynamic-layers/raspberrypi/recipes-qt/boot2qt-addons/default-qt-envs.bbappend?h=dev
일부 NXP i.MX 보드는 imx-capture라는 이름의 v4l2 디바이스를 노출하며, 이 디바이스는 GStreamer에서 v4l2src와 함께 사용할 때 오류를 일으킬 수 있습니다. Qt Multimedia 가 사용 가능한 카메라 장치 목록에 imx-capture를 추가하지 못하도록 하려면 환경 변수 QT_GSTREAMER_SKIP_IMXCAPTURE=1을 설정하세요. 이는 비공개 API로 간주되며 NXP 에서 imx-capture의 문제를 해결하면 제거됩니다.
- 시스템 메모리 비디오 프레임 또는 소프트웨어 변환을 사용하는 동영상 재생 또는 카메라 스트리밍은 CPU 부하로 인해 프레임이 끊기거나 응답하지 않을 수 있습니다. GStreamer 디코더 또는 카메라 장치가 지원되는 픽셀 형식 중 하나로 DMA-BUF 또는 GLMemory 지원 비디오 프레임을 출력하는 경우, Qt는 추가 변환이나 복사 없이 렌더링할 수 있습니다. GStreamer는 파이프라인 요소의 기능에 따라 형식과 메모리 유형을 선택합니다. 파이프라인에 추가되는 요소를 제어하는 다양한 방법은 사용자 정의 포인트에 설명되어 있습니다. v4l2 카메라에 대한 I/O 모드 지정하기를 참조하세요.
사용자 지정 포인트
Qt Multimedia 는 기본 GStreamer 파이프라인에 액세스할 수 있는 특정 사용자 지정 포인트를 제공합니다. 진입 지점은 class QGStreamerPlatformSpecificInterface 입니다. 환경 변수를 설정하여 추가 커스터마이징을 수행할 수 있습니다.
경고: 여기에 나열된 커스터마이징 포인트와 Qt 관련 환경 변수는 비공개 API로 간주되며 변경될 수 있습니다. 환경 변수는 기본적으로 하위 프로세스에서 상속되며 의도하지 않은 결과를 초래할 수 있습니다.
외부 OpenGL 텍스처 렌더링
Qt는 기본 버퍼를 EGL 이미지로 바인딩하고 셰이더에 OpenGL 텍스처로 노출하여 DMA-BUF 지원 비디오 프레임을 OpenGL 그래픽 파이프라인으로 가져옵니다. 기본적으로 Qt는 GL_TEXTURE_2D 텍스처 타겟과 표준 셰이더 코드를 사용하여 이러한 텍스처를 샘플링합니다. 일부 임베디드 보드는 전용 프래그먼트 셰이더와 함께 GL_TEXTURE_EXTERNAL_OES 텍스처 타겟을 사용하는 것이 더 나은 성능을 발휘합니다. 이 동작은 다음 환경 변수를 설정하여 활성화할 수 있습니다:
QT_MULTIMEDIA_FORCE_GL_TEXTURE_EXTERNAL_OES=1
v4l2 카메라의 I/O 모드 지정하기
QCamera 또는 QML 카메라와 함께 v4l2 캡처 장치를 사용하는 경우, 기본 v4l2src GStreamer 요소의 io-mode 속성은 제로 카피 렌더링을 허용하는 DMA-BUF 지원 비디오 프레임을 출력할지 여부에 영향을 미칩니다. 카메라 드라이버가 dmabuf 모드를 지원하더라도 기본 자동 모드가 mmap 모드를 선택하는 경우도 있습니다. io-mode 속성 int 값은 아래 환경 변수를 통해 명시적으로 설정할 수 있습니다. 다음은 열거형 GST_V4L2_IO_DMABUF를 사용하여 io-mode를 dmabuf로 설정하는 방법을 보여주는 예제입니다:
QT_GSTREAMER_V4L2SRC_IOMODE=4
특정 GStreamer 요소 선택하기
지스트리머 배포에는 미디어 파이프라인에서 잠재적으로 동일한 작업을 수행할 수 있는 여러 가지 플러그인이 포함될 수 있습니다. 지스트리머는 기능 순위에 따라 디코더 및 디멀서와 같은 요소를 자동으로 선택하며, 이는 지스트리머 환경 변수를 통해 재정의할 수 있습니다. 다음은 v4l2h264dec 하드웨어 디코더의 순위를 H.264 소프트웨어 디코더보다 높게 지정하고, aiurdemux 디멀서는 선택하지 않은 예시입니다:
GST_PLUGIN_FEATURE_RANK=v4l2h264dec:MAX,aiurdemux:NONE
런타임 중에 어떤 요소가 생성되고 있는지 검사하려면 GstElementFactory에 대해 디버그 로깅 레벨 4를 활성화하세요:
GST_DEBUG=GST_ELEMENT_FACTORY:4
또한 재생 상태 변경과 같은 다양한 이벤트에서 덤프할 .dot 그래프 파일의 폴더를 지정하여 전체 GStreamer 파이프라인을 시각적으로 검사할 수 있습니다:
GST_DEBUG_DUMP_DOT_DIR=/root/graphs
이러한 환경 변수에 대한 자세한 내용은 GStreamer 문서에서 확인하세요:
하드웨어 변환 요소 지정하기
GStreamer 파이프라인의 미디어 소스가 Qt Multimedia 에서 지원하는 픽셀 형식의 동영상 버퍼를 제공할 수 없는 경우, 적절한 하드웨어 가속 동영상 변환 요소가 포함되어 있지 않으면 파이프라인은 소프트웨어 변환을 사용합니다. 사용할 하드웨어 변환 요소를 지정하려면 다음 환경 변수에 대한 GStreamer 파이프라인 설명으로 설정하세요:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT
일부 공급업체별 변환 요소(imxvideoconvert_g2d, nvvidconv)는 사용 가능한 경우 기본적으로 파이프라인에 추가됩니다. 이로 인해 필요하지 않은 경우 불필요한 변환이 발생할 수 있으며, 동일한 환경 변수를 사용하여 GStreamer ID 요소를 지정하여 비활성화할 수 있습니다:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=identityGStreamer는 또한 OpenGL 요소를 사용하여 형식 변환을 수행하여 Qt에 GLMemory 지원 비디오 프레임을 제공할 수 있습니다:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=glupload ! glcolorconvert
원시 파이프라인 액세스
QMediaPlayer 및 QMediaCaptureSession 의 기반이 되는 GstPipeline 에 액세스할 수 있습니다.
경고: 파이프라인은 여전히 Qt 구현에 의해 관리되므로 안전하지 않은 API입니다. 이 API를 사용할 때는 각별한 주의가 필요합니다.
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QMediaPlayer player; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&player); [...] QMediaCaptureSession session; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&session);
싱크 및 소스로서의 사용자 지정 GStreamer 요소
GStreamer 파이프라인 설명에서 GStreamer 요소를 만들어 QCamera 또는 QAudioDevice 안에 래핑할 수 있습니다:
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QByteArray pipelineString = "videotestsrc is-live=true ! gamma gamma=2.0"; QMediaCaptureSession session; session.setVideoSink(wid.videoSink()); QCamera *cam = QGStreamerPlatformSpecificInterface::instance()->makeCustomGStreamerCamera( pipelineString, &session); session.setCamera(cam);
QMediaPlayer: 커스텀 소스
QMediaPlayer 은 소스 URI로 GStreamer 파이프라인 설명을 받아들입니다:
QMediaPlayer player; player.setSource(u"gstreamer-pipeline: videotestsrc name=testsrc"_s);
그러면 QMediaPlayer 에서 소스로 사용할 파이프라인 설명을 컴파일하려고 시도하고 QMediaPlayer 의 싱크에 자동으로 연결됩니다.
경고: 드래콘을 사용하지 마세요! 사용자 지정 파이프라인은 실험적인 기능으로, 특히 미디어 상태, 메타데이터 API 및 전송 상태와 같은 QMediaPlayer API에 잘 매핑되지 않습니다. 대부분의 호출은 GStreamer 파이프라인에 직접 매핑되므로 파이프라인에 따라 정의되지 않은 동작이 발생할 수 있습니다. 대부분의 경우 gstreamer-pipeline: 은 애플리케이션 코드에 적합하지 않을 수 있습니다. 임의의 비디오 소스의 경우 사용자 지정 카메라(위 참조)가 있는 QMediaCaptureSession 을 사용하는 것이 좋습니다. 임의의 복잡한 파이프라인을 Qt/QML GUI로만 그리려는 경우, GStreamer의 qml6glsink (아래 참조)가 더 강력한 선택이 될 수 있습니다.
© 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.