このページでは

Qt Multimedia GStreamer バックエンド

このページでは、組み込み Linux でのデフォルトのメディアバックエンドであるQt Multimedia の GStreamer バックエンドの制限事項とカスタマイズのポイントについて説明します。

アーキテクチャ上の考慮点

GStreamer が組み込み Linux のデフォルトのメディアバックエンドである主な理由は、 ほとんどの組み込みボードベンダがハードウェアアクセラレーションによるメディアサポートを 優先しているフレームワークだからです。プラットフォームによっては FFmpeg も適している場合があるので、ユーザは両方のメディアバックエンドを試してみて、自分に最適なものを見つけることが推奨されます。

Qt Multimedia は汎用的なストリーミングフレームワークではなく、Qt で GStreamer を使用するアーキテクチャ的に最良の方法とは限りません。GStreamer のパイプラインを高度に制御する必要があるが、Qt でのビデオ出力のみを行いたい開発者は、GStreamer のqml6glsink の使用を検討するとよいでしょう。

制限と既知の問題

GStreamer は Qt にバンドルされていませんが、通常 Linux ディストリビューションに同梱されています。

  • 特定のバグは、使用されている GStreamer のバージョンに起因している可能性があります。お使いのプラットフォームで最新のGStreamerバグフィックスリリースを使用することをお勧めします。
  • バグによっては、PulseaudioのようなGStreamerが使用するライブラリに関連している可能性もあります。特にPulseaudio v16には、GStreamerパイプラインをハングさせる既知のバグがあり、これら2つのパッチのバックポートが必要です:

    このバグは現在、Ubuntu 22.04、23.10、24.04、Debian 11、12、Fedora 39、40を含むほとんどの主流Linuxディストリビューションに影響を及ぼしている。

  • シーク、再生レート、ループ、シンクの切り替えに既知のバグがあります。
  • オーディオ機能にはPulseAudioが必要です。詳細はLinuxプラットフォームノートを参照してください。
  • 一部の組み込みボードでは、パイプライン・ネゴシエーション/リンクの問題を解決し、パフォーマンスを向上させるために、個別の設定が必要です。このような問題に直面した場合は、カスタマイズポイントに記載されている環境変数を試してみることをお勧めします。Qt の Yocto メタレイヤーファイルには、特定のボード、BSP、Boot to Qt バージョンの組み合わせに対する推奨設定が含まれています。以下はdevブランチのバージョンへのリンクです:
  • システムメモリのビデオフレームやソフトウェア変換を使用したビデオ再生やカメラストリーミングは、CPU負荷が高いため、フレーム落ちや応答不能になることがあります。GStreamer のデコーダやカメラデバイスが、DMA-BUF や GLMemory でバックアップされたビデオフレームを、Qt がサポートしているピクセルフォーマットで出力する場合、Qt は追加の変換やコピーなしでそれらをレンダリングできます。GStreamer は、パイプラインエレメントの能力に基づいてフォーマットとメモリタイプを選択します。どの要素がパイプラインに追加されるかを制御するさまざまな方法については、カスタマイズポイントで説明します。

カスタマイズポイント

Qt Multimedia は、基盤となるGStreamerパイプラインにアクセスするための特定のカスタマイズポイントを提供します。エントリーポイントはclass QGStreamerPlatformSpecificInterface です。環境変数を設定することで、追加のカスタマイズが可能です。

警告 ここに記載されているカスタマイズポイントと Qt 固有の環境変数は、プライベート API とみなされ、変更される可能性があります。環境変数はデフォルトで子プロセスに継承され、意図しない結果をもたらす可能性があることに注意してください。

外部 OpenGL テクスチャのレンダリング

Qt は、DMA-BUF バックアップされたビデオフレームを EGL イメージとしてバインドし、OpenGL テクスチャとしてシェーダに公開することで、OpenGL グラフィックパイプラインにインポートします。デフォルトでは、QtはGL_TEXTURE_2Dテクスチャターゲットと標準的なシェーダコードを使用して、これらのテクスチャをサンプリングします。組み込みボードによっては、専用のフラグメントシェーダと一緒に、代わりにGL_TEXTURE_EXTERNAL_OESテクスチャターゲットを使用した方がより良いパフォーマンスを発揮します。この動作は、以下の環境変数を設定することで有効にできます:

QT_MULTIMEDIA_FORCE_GL_TEXTURE_EXTERNAL_OES=1

特定の GStreamer エレメントの選択

GStreamerディストリビューションは、メディアパイプラインで同じタスクを実行する可能性のある複数の異なるプラグインを含むことができます。GStreamerは、デコーダーやデマクサーのようなエレメントを機能ランクに基づいて自動的に選択しますが、これは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)は、利用可能であればデフォルトでパイプラインに追加されます。これは不要な変換を引き起こす可能性があり、同じ環境変数を使用して GStreamerID要素を指定することで無効にできます:

QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=identity

GStreamer は、OpenGL 要素でフォーマット変換を行うこともでき、Qt に GLMemory でバックアップされたビデオフレームを提供します:

QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=glupload ! glcolorconvert

生のパイプラインアクセス

QMediaPlayerQMediaCaptureSession の基礎となるGstPipeline にアクセスできます。

警告 パイプラインはまだ Qt の実装によって管理されているため、この API は安全ではありません。この API を使用する際には、十分な注意が必要です。

#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h>

[...]
QMediaMediaPlayer player;
GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&player);
[...]
QMediaCaptureSession session;
GstPipeline *pipeline = QGSreamerPlatformSpecificInterface::instance()->gstPipeline(&session);

シンクおよびソースとしてのカスタム GStreamer 要素

GStreamer pipeline decription から 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 のシンクに接続されます。

警告 カスタムパイプラインは実験的な機能です!カスタムパイプラインは実験的な機能です。カスタムパイプラインはQMediaPlayer のAPI、特にメディアステータス、メタデータ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.