Qt Multimedia GStreamer バックエンド

このページでは、Qt Multimedia の GStreamer バックエンドの制限について説明します。

制限と既知の問題

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ディストリビューションに影響を及ぼしている。

  • シーク、再生レート、ループ、シンクの切り替えに既知のバグがあります。

カスタマイズポイント

Qt Multimedia は、基礎となるGStreamerパイプラインへのアクセスを可能にするために、特定のカスタマイズポイントを提供します。これらのカスタマイズポイントはプライベート API とみなされ、変更される可能性があります。エントリーポイントは です。class QGStreamerPlatformSpecificInterface

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

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 (後述)がより堅牢な選択かもしれません。

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

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

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