QTインターフェイスでビデオフレーム表示を実現するさまざまな方法とアプリケーション
(I.はじめに
1.1 QT インターフェイスでのビデオ フレームのアプリケーション シナリオ
マルチメディア アプリケーションが関与する多くのシナリオでは、ビデオ再生は非常に重要な機能です。QT を開発ツールとして使用する開発者にとって、QT インターフェイスでビデオ フレームを表示する方法を理解することは非常に重要です。次に、いくつかの典型的なアプリケーション シナリオを示します。
- ビデオ プレーヤー: 最も基本的なマルチメディア アプリケーションであるビデオ プレーヤーは、ユーザーがクリアでスムーズな画像を体験できるように、QT インターフェイスでオーディオとビデオの同期再生をスムーズに実現する必要があります。
- リアルタイム監視システム: セキュリティの分野では、リアルタイム監視システムは、カメラによってキャプチャされたリアルタイム画像を QT インターフェイスに表示する必要があります。これは、ユーザーがリアルタイムで表示および制御するのに便利です。
- 会議ソフトウェアと遠隔教育: リアルタイムの音声とビデオの送信を伴うこれらのシナリオでは、ビデオ フレームが QT インターフェイスに表示され、参加者または学生間の即時の対話をサポートします。
- 広告とメディア表示: 一部の商用シナリオでは、ビデオ広告やプロモーション ビデオを表示するには、ユーザーが他の操作を実行するときに再生できるように、これらのビデオ メディアを QT アプリケーションに埋め込む必要があります。
- ビデオ編集および処理ソフトウェア: このタイプのアプリケーションでは、ユーザーは処理されたビデオ効果をプレビューする必要があります。したがって、ビデオ フレームをリアルタイムで表示し、QT インターフェイスにリアルタイム プレビュー機能を提供する必要があります。
- ゲームおよびインタラクティブ エンターテイメント: 多くのゲームおよびインタラクティブ エンターテイメント アプリケーションには、事前レンダリングされたビデオまたはリアルタイム レンダリングが含まれています。QT でビデオ フレーム表示を実現すると、ゲーム体験が豊かになり、画質が向上します。
上記のシナリオは、QT インターフェイスでビデオ フレーム表示を実現するための典型的なアプリケーションのほんの一部です。テクノロジーの発展に伴い、機能要件はますます多様化しているため、開発者はさまざまな実装方法と戦略を理解することが非常に重要です。
1.2 さまざまな手法のパフォーマンスと適用性の分析
QT インターフェイスでビデオ フレーム表示を実現する場合、適切な方法を選択することが非常に重要です。さまざまな方法がさまざまなシナリオに適しており、それぞれに長所と短所があるためです。以下は、さまざまな方法のパフォーマンスと適用性の分析です。
1.2.1 QLabel と QPixmap の使用
- 利点: 実装が簡単で、理解と操作が簡単で、初心者やラピッドプロトタイピングに適しています。
- 短所: リフレッシュ レートが高フレーム レートのビデオを処理できるほど高くない可能性があり、パフォーマンスが比較的低い場合があります。
- 適用可能なシナリオ: 単純なビデオ プレーヤー、広告、メディア表示など、ビデオ フレーム レートが低い、または特別な処理を行わないシナリオに適用できます。
1.2.2 QPainter とカスタム描画の使用
- 利点: 高いパフォーマンスと描画制御機能を提供し、カスタム描画操作を実行でき、高い拡張性を備えています。
- 短所: 実装方法が比較的複雑であり、QT 描画原理をある程度理解する必要があります。
- 適用可能なシナリオ: ビデオ特殊効果処理やリアルタイム ビデオ ストリーム表示など、高いパフォーマンスと表示効果を必要とするシナリオに適用できます。
1.2.3 QAbstractVideoSurface の使用
- 利点: QT マルチメディア モジュールの動作モードに合わせて、高度なビデオ処理機能、高性能などを提供します。
- 短所: 実装が難しく、QT マルチメディア関連コンポーネントについての深い理解が必要です。
- 適用可能なシナリオ: リアルタイム監視システム、会議ソフトウェア、遠隔教育などの高度なビデオ アプリケーションの実装や、QT マルチメディア モジュールとの緊密な統合に適しています。
適切なビデオ フレーム表示方法を選択するには、特定のニーズ、開発経験、短期および長期の目標に基づいたトレードオフが必要です。この記事の次の章では、さまざまな方法の実装プロセス、原理、利点と欠点を詳細に紹介し、実際のプロジェクトで最適な方法を選択するための強力な参考としたいと考えています。
1.3 この記事の構成と目的
この記事の主な目的は、開発者が QT インターフェイスでビデオ フレーム表示を実現するさまざまな方法を理解し、習得できるようにすることです。基本原理を高度なアプリケーションに導入し、開発者が自分のニーズに応じて最適なソリューションを選択できるように、さまざまなシナリオにおけるさまざまな方法の長所、短所、適用可能性を詳細に分析します。
記事の構成は次のとおりです。
- まず、第 2 章、第 3 章、および第 4 章で、QLabel と QPixmap を使用する方法、QPainter とカスタム描画を使用する方法、および QAbstractVideoSurface を使用してビデオ フレームを表示する 3 つの方法について、中心となる原理、実装手順、利点と欠点の分析を含めて詳しく紹介します。
- 次に、第 5 章から第 7 章では、アプリケーションの分析、実際のシナリオにおけるパフォーマンスの最適化とテクニック、他の QT コンポーネントやライブラリとの統合に焦点を当てます。
- 読者が実際のアプリケーションをよりよく理解できるように、第 8 章では、さまざまなシナリオに応じて適切なビデオ フレーム表示方法を選択する方法を示す簡単なビデオ プレーヤーの例を示します。
- 最後に、第 9 章と第 10 章では、QT ビデオ フレーム処理テクノロジーの拡張アプリケーションと高度な方向性、開発動向と期待について説明します。
この記事を読むことで、QT インターフェイスでビデオ フレームを表示するためのさまざまな方法を深く理解し、それらの長所と短所、および適用可能なシナリオを把握し、実際のアプリケーションで良い結果を達成できることを願っています。あなたが初心者であろうと経験豊富な開発者であろうと、ここにあるコンテンツはあなたにインスピレーションを与え、役立つと信じています。
(2) QLabelとQPixmapを利用してビデオフレーム表示を実現
2.1 QLabel と QPixmap の概要
QLabel の概要
QLabel は、テキストまたは画像を表示するための基本的な UI コントロールです。これは QWidget から継承しており、ワードラップ、リッチテキストサポートなどの追加機能を提供します。静止画や単純な文字情報を表示するシーンで広く使われています。
QLabel の一般的なメソッドには、setText() (テキスト コンテンツの設定) および setPixmap() (QPixmap オブジェクトの設定) があります。このセクションでは、setPixmap() メソッドの使用に焦点を当てます。
QPixmap の概要
QPixmapはピクセルマップ(ビットマップ)を扱うクラスであり、QPaintDeviceを継承する画像クラスでもあります。QPixmap は、PNG、JPEG などの複数の画像形式を保存でき、QT アプリケーションのどこにでも描画できます。QImage と比較した場合、QPixmap の利点は、画面に直接描画できる画像データをメモリに保存するため、描画操作をより効率的に実行できることです。
QPixmap は、QImage から変換された静的メソッド QPixmap::fromImage() を提供します。これにより、デコードされたビデオ フレーム (QImage の形式で保存されている) を QPixmap オブジェクトに簡単に変換できます。
QLabel と QPixmap の基本概念を理解した後、セクション 2.2 に入り、QImage を QPixmap に変換して QLabel に表示する方法を詳しく紹介します。
2.2 QImage を QPixmap に変換し、QLabel に表示する
このサブセクションでは、デコードされたビデオ フレーム (QImage として保存) を QPixmap オブジェクトに変換し、それを QLabel に表示する方法を学びます。この機能を実現する手順は次のとおりです。
ステップ 1: QLabel オブジェクトを作成する
まず、QPixmap オブジェクトを表示するために使用される QLabel オブジェクトを作成する必要があります。これは次のコードで実現できます。
#include <QLabel>
// ...
QLabel* label = new QLabel(parent);
その中には、parent
QLabel の親オブジェクト、通常は QLabel を含むメイン ウィンドウまたはレイアウト コンテナーがあります。QLabel オブジェクトを Qt Designer に直接追加し、「ui」オブジェクトを介してコード内で参照することもできます。
ステップ 2: QImage を QPixmap に変換する
QPixmap::fromImage() 静的メソッドを使用して、QImage オブジェクトを QPixmap オブジェクトに変換します。例えば:
#include <QPixmap>
#include <QImage>
// ...
QPixmap pixmap = QPixmap::fromImage(your_qimage);
QPixmap::fromImage() は静的メソッドであるため、QPixmap オブジェクトを作成せずに呼び出すことができます。
ステップ 3: QLabel に QPixmap を表示する
QLabel の setPixmap() メソッドを使用して、QPixmap を QLabel に表示できるようになりました。こんな感じの簡単な操作です。
label->setPixmap(pixmap);
コード例
上記の手順を組み合わせた、デコードされたビデオ フレーム (QImage) を QPixmap に変換し、QLabel に表示する方法を示す完全な例を以下に示します。
#include <QLabel>
#include <QPixmap>
#include <QImage>
// ...
QLabel* label = new QLabel(parent);
QPixmap pixmap = QPixmap::fromImage(your_qimage);
label->setPixmap(pixmap);
この方法はシンプルで使いやすく、フレームレートが低いシーンや静止画表示に適しています。ただし、高フレームレートのビデオを扱う場合、QLabel のリフレッシュ レートがビデオの更新速度に追いつかず、表示が滑らかにならない場合があります。後続の章では、この問題を解決する他の方法について説明します。
2.3 QLabel と QPixmap を使用する利点、欠点、および適用可能なシナリオ
QLabel と QPixmap を使用してビデオ フレームを表示する方法を理解した後、この方法の長所と短所、および適用可能なシナリオを分析します。
アドバンテージ
- 使いやすさ: QLabel と QPixmap を使用すると、面倒な描画原理を理解することなく、数行の簡単なコードでビデオ フレームを表示できます。
- クロスプラットフォーム互換性: QLabel と QPixmap はどちらも、さまざまなプラットフォームやシステム上でスムーズに実行できる基本的な QT コンポーネントです。
- 適応サイズ: QLabel は、表示されるビデオ フレームに合わせて自動的にサイズ変更できます。これは、異なる解像度のビデオを扱う場合に非常に便利です。
欠点がある
- リフレッシュ レートの制限: QLabel のリフレッシュ レートが低く、高フレーム レートのビデオを処理できない場合があり、その結果、表示が滑らかでなくなります。
- 定制性较差:使用QLabel和QPixmap的方法无法对视频帧绘制进行高度定制,对于需要应用图像处理或视频效果的场景不太适用。
适用场景:
- 静态图像展示:当需要在QT界面中展示静态图像或者低帧率的图像序列时,使用QLabel和QPixmap是一个简便快捷的方法。
- 低复杂度项目:对于简单的UI设计,如展示摄像头捕获的实时图像,可以快速实现基本的显示功能,降低开发难度。
- 未知分辨率的视频:由于QLabel拥有自适应大小的特性,可以轻松应对不同分辨率的视频显示,无需手动调整控件大小。
总之,使用QLabel和QPixmap显示视频帧的方法适合简单应用场景,特别是静态图像展示或低帧率视频播放。然而,对于高帧率视频或者需要高度定制化绘制的场景,我们需要探讨其他更加灵活和高效的方法,如使用QPainter或QAbstractVideoSurface。在下一章节中,我们将介绍如何使用QPainter实现视频帧的显示。
(三) 使用QPainter和自定义绘制实现视频帧显示
3.1 QPainter简介与绘制原理
QPainter 是一个用于在 QWidget,QImage,QPixmap等设备上绘制图形的强大工具。它提供了用于绘制文本、线条、形状、图像等的多种功能。在本节中,我们将首先介绍 QPainter 的工作原理,然后讨论如何使用它将视频帧绘制到 QT 界面上。
QPainter 的工作原理主要包括以下几个步骤:
- 创建 QPainter 实例:首先,需要创建一个 QPainter 对象来进行绘制操作。QPainter 对象可以绑定到 QWidget、QImage、QPixmap 等设备上。为了绘制视频帧,我们需要将 QPainter 绑定到 QWidget 对象上。
QPainter painter(your_widget);
- さまざまな描画関数を使用する: QPainter を使用すると、さまざまな関数を呼び出して、テキストや線などの描画など、さまざまな描画効果を実現できます。QWidget にビデオ フレームを描画するには、drawImage() 関数を使用する必要があります。この関数は 2 つのパラメーターを受け取ります。最初のパラメーターは描画点の座標を示し、2 番目のパラメーターは描画する QImage オブジェクト、つまりビデオ フレームです。
painter.drawImage(0, 0, your_qimage);
- 描画を終了して送信: 描画タスクを完了したら、QPainter オブジェクトの描画を正しく終了する必要があります。ほとんどの場合、QPainter の描画を明示的に終了する必要はありません。QPainter オブジェクトがスコープ外になると、自動的にコミットされます。必要に応じて、 end() メソッドを使用して描画を手動で終了できます。
QPainterの描画処理は通常QWidgetのpaintEvent()関数内で行われます。この関数は QWidget の描画イベントの実装を提供します。QWidget が再描画する必要がある場合は常に、この関数が自動的に呼び出されます。そのため、ビデオフレームの描画を実現する場合は、カスタムQWidgetクラスのpaintEvent()関数を書き換えて、QPainterオブジェクトを作成し、その中にQImageを描画する必要があります。
次のセクションでは、カスタム QWidget クラスを作成してビデオ フレーム ペイントを実装する方法を詳しく説明し、新しいフレームがデコードされたときにPaintEvent() を起動する方法を説明します。
3.2 カスタム QWidget を作成してビデオ フレーム描画を実現する
QPainter を使用して QWidget 上にビデオ フレームを描画するには、カスタム QWidget クラスを作成し、そのクラス内でPaintEvent() 関数をオーバーライドする必要があります。カスタム QWidget クラスを作成し、ビデオ フレーム描画を実装する手順は次のとおりです。
- カスタム QWidget クラスを作成し、基本 QWidget クラスから継承します。その後の使用の便宜のために、カスタム クラスを呼び出すことができます
VideoWidget
。
class VideoWidget : public QWidget {
// ...
};
- カスタム QWidget クラスで、表示する現在のビデオ フレームを格納する QImage メンバー変数を宣言します。外部から呼び出される setter 関数だけでなく、paintEvent() 関数でも変数にアクセスできることを確認する必要があります。
class VideoWidget : public QWidget {
// ...
private:
QImage m_image;
};
- オーバーライド
paintEvent()
機能。この関数では、QPainter インスタンスを作成し、それを使用して QImage メンバー変数をペイントします。drawImage()
QPainterの関数が呼び出され、描画点の座標(通常は0,0点)とQImageがパラメータとして渡されることに注意してください。
class VideoWidget : public QWidget {
protected:
void paintEvent(QPaintEvent* event) override {
QPainter painter(this);
painter.drawImage(0, 0, m_image);
}
};
- QImageを更新するセッター関数を作成します。外部コードの新しいビデオ フレームをデコードするときは、 setter 関数を呼び出して m_image メンバー変数を更新し、
update()
関数を呼び出してトリガーする必要がありますpaintEvent()
。
class VideoWidget : public QWidget {
public:
// ...
void setImage(const QImage& image) {
m_image = image;
update();
}
};
- 外部コードでカスタムのものを使用します
VideoWidget
。メイン ウィンドウまたは他のレイアウトでインスタンスを作成し、関数を通じてVideoWidget
デコードされたビデオ フレームをインスタンスに渡すことができます。setImage()
VideoWidget* videoWidget = new VideoWidget;
videoWidget->setImage(your_qimage);
要約すると、カスタムVideoWidget
クラスを使用することで、QPainter と QWidget を組み合わせて、デコードされたビデオ フレームを QT アプリケーションのインターフェイスに描画できます。この方式は描画性能が高く、高フレームレートの映像の表示に適しています。次のセクションでは、QPainter を使用する利点と欠点、および適用可能なシナリオについて説明します。
3.3 QPainter を使用する利点と欠点、および適用可能なシナリオ
QPainter を使用してビデオ フレームを描画することは、柔軟で高性能な方法です。このセクションでは、ビデオ フレーム表示に QPainter を使用する利点と欠点、およびその適切なアプリケーション シナリオについて説明します。
アドバンテージ
- 優れたパフォーマンス: QLabel や QPixmap を使用する方法と比較して、QPainter の描画速度は速く、高フレームレートのビデオの処理と表示に適しています。
- 強力な柔軟性: QPainter は豊富な描画機能を提供し、ユーザーはビデオ フレームにテキスト、グラフィックス、ダイナミック オーバーレイなどを追加するなど、さまざまなカスタム効果を簡単に実現できます。
- 優れた適応性: QPainter はさまざまなデバイス (QWidget、QImage、QPixmap など) 上で描画できるため、さまざまなシナリオでの適応性が高くなります。
欠点がある
- 実装の複雑さはわずかに高くなります。QLabel や QPixmap を使用する場合と比較して、QPainter はカスタム QWidget を作成し、paintEvent() 関数を書き直す必要があります。これにより実装の複雑さが増すため、初心者や単純な表示のみが必要なシナリオには適さない可能性があります。
- メモリを手動で管理する必要がある: ビデオ フレームが大きい場合、または更新頻度が高い場合、メモリ リークやパフォーマンスの低下を避けるために、ビデオ フレームのメモリ空間を手動で管理する必要がある場合があります。
該当シーン
QPainter を使用したビデオ フレーム表示は、次のシナリオに適しています。
- 高フレーム レートのビデオ: QPainter は高性能の描画機能を備えているため、高フレーム レートのビデオ表示の処理に特に適しています。
- カスタム描画効果: ビデオ フレーム上にさまざまなカスタム効果 (グラフィックス、テキスト、ダイナミック オーバーレイなど) を描画する必要がある場合、QPainter が理想的な選択肢です。
- クロスプラットフォーム アプリケーション: プラットフォーム間でビデオ フレームを表示する必要があるアプリケーションでは、QPainter の適応性を利用して、より優れた互換性と安定性を実現できます。
つまり、QPainter は強力で優れたパフォーマンスのビデオ フレーム表示方法です。高フレームレートのビデオを処理する必要がある場合、またはカスタムの描画効果を実現する必要がある場合は、QPainter の方が良い選択です。ただし、単にビデオ フレームを表示するだけでよく、高フレーム レートのサポートが必要ない場合は、QLabel メソッドと QPixmap メソッドを使用する方が簡単です。実際のプロジェクトでは、特定のニーズに応じて最適なビデオ フレーム表示方法を選択する必要があります。
(4) QAbstractVideoSurfaceを利用してビデオフレーム表示を実現
4.1 QAbstractVideoSurface の概要と原理
QAbstractVideoSurface
ビデオフレームを処理するための抽象クラスです。このクラスは、開発者がビデオ フレームをカスタム QT コンポーネントに描画するなど、独自のビデオ レンダリング メソッドをカスタマイズできるようにするインターフェイスを定義します。これは QT マルチメディア モジュールの一部であり、さまざまなビデオ レンダリングのニーズをサポートするために使用されます。
デフォルトでは、QT は、や他のマルチメディア コンポーネントと一緒に使用できるQVideoWidget
、いくつかの事前定義されたビデオ表示コンポーネントを提供します。QMediaPlayer
ただし、これらの事前定義されたコンポーネントは、カスタム描画、リアルタイム処理、フィルターなどの特殊なニーズには十分ではない場合があります。この場合、 を使用してQAbstractVideoSurface
独自のビデオ表示コンポーネントを作成できます。
QAbstractVideoSurface
次のメソッドが定義されているため、ビデオ フレーム コンテンツを記述してカスタム コンポーネントに渡すことができます。
supportedPixelFormats
: このメソッドは、サポートされているすべてのピクセル形式を含むリストを返しますQVideoFrame::Format_RGB32
。描画のニーズとハードウェアの機能に基づいて、サポートする形式を選択する必要があります。start
: このメソッドは、ビデオ フレームのストリーミングが開始されるときに呼び出されます。ここでは、バッファの作成や描画スレッドの開始などの初期化作業を行うことができます。stop
: このメソッドは、ビデオ フレームのストリームが終了したときに呼び出されます。ここで、リソースの解放や描画スレッドの停止などのクリーンアップを行う必要があります。present
: ビデオ フレームごとに、このメソッドが呼び出されます。QVideoFrame
このメソッドでは、オブジェクトを取得し、必要に応じてビデオ フレームを描画します。
カスタム クラスを実装するときは、これらのメソッドをオーバーライドし、メソッドに特定の描画ロジックを実装するQAbstractVideoSurface
必要があります。present()
このようにして、さまざまな高度なアプリケーションのニーズを満たす独自の方法でビデオ フレームを表示できます。
4.2 present()関数を書き換えてビデオフレーム描画を実現する
カスタムクラスでは、ビデオフレームの描画を実現するために関数をQAbstractVideoSurface
書き直す必要があります。この関数には、ビデオ フレームのピクセル データとメタ情報を含むオブジェクトが渡されます。このオブジェクトを使用して、カスタム コンポーネントにビデオ フレームを描画できます。present()
present()
QVideoFrame
QAbstractVideoSurface
以下は、カスタムサブクラスを定義し、present()
ビデオ フレームを描画する関数をオーバーライドする方法の例です。
#include <QAbstractVideoSurface>
#include <QVideoFrame>
class CustomVideoSurface : public QAbstractVideoSurface
{
Q_OBJECT
public:
explicit CustomVideoSurface(QObject *parent = nullptr) : QAbstractVideoSurface(parent) {
}
// 重写supportedPixelFormats()方法,返回支持的像素格式列表
QList<QVideoFrame::PixelFormat> supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const override
{
Q_UNUSED(handleType)
// 仅支持RGB32格式,可以根据需求添加更多格式
return {
QVideoFrame::Format_RGB32};
}
// 重写present()方法,绘制视频帧
bool present(const QVideoFrame &frame) override {
// 根据需求将视频帧绘制到自定义组件上,例如使用QPainter或OpenGL等方法
// …
// 如果绘制成功,返回true,否则返回false
return true;
}
};
オーバーライドされたpresent()
メソッドでは、別のメソッド (たとえば、OpenGL など) を使用してビデオ フレームを描画できますQPainter
。ここでの描画方法は、QAbstractVideoSurface
関連するカスタム コンポーネントに応じて選択する必要があることに注意してください。
たとえば、カスタム コンポーネントが から継承している場合QWidget
、 を使用してQPainter
ビデオ フレームを描画できます。この場合、QVideoFrame
オブジェクトをQImage
オブジェクトに変換してから、QPainter
draw this を使用する必要がありますQImage
。QVideoFrame
に変換する方法の例を次に示しますQImage
。
QVideoFrame cloneFrame(frame);
cloneFrame.map(QAbstractVideoBuffer::ReadOnly);
QImage image(cloneFrame.bits(),
cloneFrame.width(),
cloneFrame.height(),
cloneFrame.bytesPerLine(),
QVideoFrame::imageFormatFromPixelFormat(cloneFrame.pixelFormat()));
// 使用QPainter绘制`image`
// …
cloneFrame.unmap();
同様に、カスタム コンポーネントがレンダリングに OpenGL を使用する場合、QVideoFrame
オブジェクトを OpenGL テクスチャとしてアップロードし、OpenGL コンテキストで描画できます。これには、OpenGL テクスチャ操作とレンダリング パイプライン関連の知識に精通している必要があります。
このようにして、さまざまなビデオ フレーム描画戦略を自由に実装し、特定のニーズに応じて高度にカスタマイズされたビデオ再生コンポーネントを作成できます。
4.3 QAbstractVideoSurface を使用する利点と欠点、および適用可能なシナリオ
ビデオ フレーム表示の使用にはQAbstractVideoSurface
一定の長所と短所があり、実際のニーズに応じて特定のシーンに適しているかどうかを判断できます。
アドバンテージ:
- 高度なカスタマイズ性:
QAbstractVideoSurface
開発者はカスタム描画メソッドを使用してビデオ フレームを表示でき、プラットフォーム、ハードウェア、およびディスプレイ ソリューションで最適化できます。 - 拡張性:リアルタイム処理やフィルターなど、さまざまな高度なアプリケーションや意思決定を実現するために、
QAbstractVideoSurface
他の QT マルチメディア コンポーネントと統合できます。QMediaPlayer
- クロスプラットフォームのサポート:
QAbstractVideoSurface
QT マルチメディア モジュールの一部であり、複数のプラットフォームで使用できます。これは、開発者が一連のコードを記述して、複数のオペレーティング システムおよびデバイス上でビデオ フレーム描画を実現できることを意味します。
欠点:
QLabel
実装の複雑さ:およびQPixmap
orを使用する方法と比較してQPainter
、カスタムQAbstractVideoSurface
サブクラスを実装するには、より多くの QT マルチメディア コンポーネントを操作する必要があります。これにより、開発コストと保守コストが増加します。- パフォーマンス:
QAbstractVideoSurface
シーン固有の最適化は可能ですが、最適化戦略が正しく実装されていない場合、実際の描画パフォーマンスは他の方法よりも低くなる可能性があります。
該当するシーン:
ビデオ フレーム表示の使用はQAbstractVideoSurface
、次のシナリオに適用できます。
- 高度にカスタマイズされたビデオ フレームの表示が必要で、ライブ フィルター、カスタム レイヤー、ブレンディングやマスキングなどの他の方法では実現できない場合。
QMediaPlayer
開発者が QT マルチメディア モジュールと統合する必要があり、使用中にビデオのレンダリング方法を動的に切り替えるなど、表示方法をシームレスに切り替えることができるシステムを構築したい場合。
利点、欠点、および適用可能なシナリオを考慮すると、ビデオ フレーム表示の使用はQAbstractVideoSurface
高度なオプションと見なすことができ、開発者はそれが実際のプロジェクト要件に従って適用可能かどうかを評価する必要があります。単純なビデオ再生機能の場合は、QLabel
およびQPixmap
またはを使用する方QPainter
が適切な場合があります。プロジェクトの機能要件が増加し、表示のカスタマイズが必要な場合、開発者はQAbstractVideoSurface
要件を満たすためにカスタム サブクラスの実装を検討できます。
(5) 実際のシナリオでのアプリケーション分析
5.1 高フレームレート映像に最適な表示方式の選択
高フレーム レートのビデオでは、適切な表示方法を使用することが非常に重要です。高フレーム レートでは、グラフィックス レンダリングの負荷が増大し、遅延やフレーム落ちなどの問題が発生する可能性があるためです。このセクションでは、上記の 3 つの方法 (QLabel と QPixmap、QPainter とカスタム描画、QAbstractVideoSurface) に基づいて、高フレーム レートのビデオに最適な表示方法を分析します。
- QLabel と QPixmap は、ビデオの各フレームを QPixmap オブジェクトに変換し、それを表示のために QLabel にロードする必要があります。シンプルで実装は簡単ですが、QLabel にはリフレッシュ レートが制限されているため、高フレーム レートのビデオを表示すると遅延したり、ビデオ レートに追いつけなくなる可能性があります。したがって、この方法は高フレーム レート環境では最適ではありません。
- QPainter とカスタム ペイントは、カスタム QWidget クラスのPaintEvent() メソッドでビデオの各フレームをレンダリングできるため、より詳細な制御が可能になります。この方法はパフォーマンスと応答速度が高く、高フレームレートのビデオのニーズをある程度満たすことができます。ただし、QWidget の更新メカニズムによって依然として制限されており、更新のたびに追加のパフォーマンス オーバーヘッドが発生する可能性があります。
- QAbstractVideoSurface この方法は、高フレーム レートのビデオで最も効果的に機能します。これは、Qt の基礎となるビデオ処理フレームワークに基づいて構築されており、不必要なビュー更新操作を回避し、より高いレンダリング レートを提供します。さらに、さまざまな画像形式やビデオ ソースに自動的に適応できるため、高フレーム レート環境に簡単に適用できます。
上記の分析に基づいて、高フレーム レートのビデオ表示では、QAbstractVideoSurface メソッドの使用をお勧めします。QAbstractVideoSurface メソッドの方がパフォーマンスが高く、さまざまなシナリオでのビデオ フレーム処理のニーズを満たすためのより多くの制御の可能性を提供できるからです。
5.2 特定のデバイスにおける複数のメソッドの適応性分析
ハードウェア リソースとパフォーマンスが限られている状況では、特定のデバイスに適切なビデオ フレーム表示方法を選択する方法が特に重要です。このセクションでは、QLabel と QPixmap、QPainter とカスタム描画、QAbstractVideoSurface の 3 つのメソッドのさまざまなデバイス タイプでの適応性を分析します。
- QLabel および QPixmap: 組み込みデバイス、低パフォーマンスのデバイス、またはリソースに制約のあるデバイスの場合、QLabel および QPixmap メソッドの実装しきい値と運用要件は低くなります。この方法はシンプルで使いやすく、追加リソースの消費も少なくなります。ただし、高フレーム レートのビデオやビューが動的に更新されるシナリオを扱う場合、パフォーマンスが制限される可能性があります。
- QPainter とカスタム描画: QPainter は、グラフィックス レンダリングと視覚効果を必要とする中高性能デバイスに適した強力な描画機能を提供します。カスタム QWidget クラスを使用すると、ビデオ フレームのレンダリングをより詳細に制御できるようになります。ただし、より制限された低パフォーマンスのデバイスでは、この方法では高いパフォーマンスのオーバーヘッドが発生する可能性があります。
- QAbstractVideoSurface: デスクトップ、高性能ノートブック、ハイエンド モバイル デバイスなどの高性能デバイスでは、QAbstractVideoSurface メソッドはレンダリングの利点を最大限に発揮できます。より効率的なビデオ レンダリングを可能にする低レベルのビデオ処理フレームワークを提供します。ただし、低パフォーマンスのデバイスでは、大量のリソース消費の問題に直面する可能性があります。
つまり、ビデオフレームの表示方法を選択するときは、デバイスのパフォーマンスとリソースの制約に基づいて判断する必要があります。使いやすい QLabel メソッドと QPixmap メソッドは、リソースに制約のあるデバイスに適していますが、高フレーム レートのシナリオでは十分なパフォーマンスが得られない可能性があります。QPainter とカスタム描画メソッドは中高性能デバイスに適応でき、より視覚的な制御を提供します。最後に、高性能デバイスは QAbstractVideoSurface を利用してビデオ フレームを効率的にレンダリングできます。それぞれの方法にはメリットとデメリットがあり、実際のデバイス環境や利用シーンに応じて適切に選択する必要があります。
5.3 拡張アプリケーション: ビデオエフェクト処理とリアルタイムビデオストリーム表示
上記で紹介したさまざまなビデオ フレーム表示メソッド (QLabel と QPixmap、QPainter とカスタム描画、QAbstractVideoSurface) に基づいて、ビデオ エフェクト処理やリアルタイム ビデオ ストリーム表示など、より多くのシナリオや機能に適用できます。このセクションでは、拡張アプリケーションにおけるこれら 3 つのメソッドの実装とパフォーマンスを分析します。
(1) ビデオエフェクト処理
フィルタ、マスク、スケーリングなどのビデオ効果処理には、通常、ビデオ フレームに基づいたピクセル レベルの操作が必要です。先ほど説明した 3 つの方法によると、ビデオ エフェクト処理に関しては、それぞれ次のような特徴があります。
- QLabel メソッドと QPixmap メソッドは、基本的な画像調整やスケーリングなどの単純なビデオ効果処理に適しています。ただし、パフォーマンスが限られているため、大量の計算集約的なピクセル操作をリアルタイムで処理するのには適していない可能性があります。
- QPainter およびカスタム描画メソッドは、ビデオ効果処理においてより柔軟であり、QPainter の描画機能を効果的に使用できます。PaintEvent() メソッドをオーバーライドすることで、ビデオ フレームをリアルタイムで処理し、カスタム エフェクトを追加できます。ただし、このアプローチでは、複雑なピクセル操作で高性能のオーバーヘッドが発生する可能性があります。
- QAbstractVideoSurface メソッドは、ビデオ効果を処理する場合に最高のパフォーマンスを発揮します。これにより、基礎となるビデオ フレーム データに対して効率的なピクセル処理操作を実行できるようになり、リアルタイムのビデオ処理結果が得られます。さらに、OpenGL などのグラフィックス レンダリング ライブラリと組み合わせて、より効率的なビデオ エフェクト処理を実現することもできます。
(2) リアルタイムビデオストリーム表示
Web カメラ、ビデオ監視システムなどのライブ ビデオ ストリームは、ビデオ データをリアルタイムで受信しながら表示する必要があります。リアルタイム ビデオ ストリーム表示に関する各メソッドのパフォーマンスは次のとおりです。
- QLabel メソッドと QPixmap メソッドは、特に高フレーム レートや複雑なビュー更新を伴うシナリオでは、リアルタイム ビデオ ストリーム表示のパフォーマンスが制限されており、遅延やフレーム ドロップが発生する可能性があります。
- QPainter とカスタム描画メソッドは、リアルタイムのビデオ ストリーム表示でより優れたパフォーマンスを発揮し、より高いビューの更新とレンダリング速度を実現します。ただし、QWidget の更新メカニズムによる制限が依然としてあり、ある程度のパフォーマンスのオーバーヘッドが発生する可能性があります。
- QAbstractVideoSurface メソッドは、リアルタイム ビデオ ストリーミング表示に最高のパフォーマンスを発揮します。これは、基礎となるビデオ処理フレームワークに基づいており、追加のビュー更新操作を回避し、高いレンダリング レートを提供します。
一般に、QAbstractVideoSurface メソッドは、ビデオ効果処理およびリアルタイム ビデオ ストリーム表示の拡張アプリケーションで最高のパフォーマンスを発揮します。QPainter とカスタム描画メソッドも、特定のシナリオでより良い結果を提供できます。ビデオエフェクト処理やリアルタイムビデオストリーム表示を実現するには、実際のニーズとデバイスのパフォーマンスのバランスを考慮して、さまざまなシナリオに応じて適切な方法を選択する必要があります。
(6) パフォーマンスの最適化と手法
6.1 リフレッシュ周波数と同期戦略の選択
QT インターフェイスでビデオ フレームを表示する場合、重要なパフォーマンス指標はリフレッシュ レートです。リフレッシュ レートは、ユーザーのビデオ視聴の流暢さを決定します。リフレッシュ レートが低すぎると、ビデオの再生がフリーズし、視聴体験に影響を与えます。この章では、読者がこの問題を解決できるように、更新頻度と同期戦略の選択から始めます。
まず、リフレッシュ レートを理解するには、コンピューター モニターがどのように動作するかを理解する必要があります。モニターは通常、垂直同期 (VSync) サイクルと呼ばれる定期的な間隔で画面上の画像を更新します。優れた同期戦略では、ビデオ フレームのリフレッシュ レートをディスプレイのリフレッシュ レートと調整して、視聴体験を向上させる必要があります。
QT では、リフレッシュ レートを制御するために使用できる方法がいくつかあります。
- 用途
QTimer
:QTimer
QT でよく使用されるタイマー コンポーネントです。QTimer
インスタンスを作成し、スロット関数でビデオ フレームを更新できます。ディスプレイのリフレッシュ レートにできるだけ近くなるように、タイマーの間隔時間として適切な値を選択する必要があることに注意してください。同時に、フレーム レートが速すぎることを避けるために、正確なタイマー タイプを設定するQTimer
ことができます。setTimerType(Qt::PreciseTimer)
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &VideoWidget::updateFrame);
timer->setTimerType(Qt::PreciseTimer);
timer->start(1000 / target_fps);
- アダプティブ リフレッシュ レート: アダプティブ リフレッシュ レートを実現するには、現在のフレームと前のフレームの間の時間間隔を計算し、その間隔時間に従ってリフレッシュ レートを調整する必要があります。これは、
QElapsedTimer
を使用することで実現できます。各フレームがリフレッシュされる前にQElapsedTimer
時間差が取得され、その差に応じて適切なリフレッシュ周波数が選択されます。
QElapsedTimer timer;
timer.start();
while (streaming) {
qint64 elapsed = timer.elapsed();
timer.restart();
// 根据elapsed调整刷新频率
}
ビデオソースが不安定な場合やフレーム間隔が大きく変動する場合、適応リフレッシュレートによりビデオ再生が滑らかにならない場合があることに注意してください。
- ディスプレイのリフレッシュ レートを取得するために使用します
QScreen
。ディスプレイのリフレッシュ レートをより正確に同期するために、QScreen
クラスを使用して現在のディスプレイのリフレッシュ レートを取得できます。QTimer
次に、このリフレッシュ レートを、リフレッシュ レートを計算または適応するためのターゲット フレーム レートとして使用できます。
QScreen* screen = QGuiApplication::primaryScreen();
if (screen) {
qreal refreshRate = screen->refreshRate();
}
つまり、QT インターフェイスでのビデオ フレーム表示のパフォーマンスは、適切なリフレッシュ レートと同期戦略を選択することで大幅に向上できます。プロジェクトによってニーズは異なる場合があるため、読者は実際の状況に応じて自分のプロジェクトに最も適した方法を比較検討して選択する必要があります。
6.2 メモリ管理とリソース回復
QT インターフェイスでビデオ フレームの表示を実現する場合、メモリ管理とリソース回復は無視できない重要なリンクです。タイムリーかつ合理的なメモリ管理とリソース回復がなければ、メモリ リーク、プログラムのクラッシュ、その他の問題が発生する可能性があります。この章では、メモリ管理とリソース回復に関するいくつかのテクニックを紹介します。
- メモリをできるだけ再利用する: ビデオ フレームを処理するとき、大量のメモリの割り当てと解放の操作が必要になる場合があります。メモリ割り当てのオーバーヘッドを軽減するには、割り当てられたメモリをできるだけ再利用します。たとえば、ループ内でビデオ フレームを処理する場合、作成された
QImage
、 、QPixmap
などのオブジェクトをループの外に移動し、各フレーム処理で再利用できます。
QImage frame(buffer_width, buffer_height, QImage::Format_RGB888);
for (int i = 0; i < frame_count; ++i) {
// Process the current frame using the existing 'frame' QImage object
}
- スマート ポインターを使用してリソースを管理する: リソースのリサイクル プロセスを簡素化するために、 C++11 で提供されるスマート ポインター タイプ ( または
std::shared_ptr
など) を使用してstd::unique_ptr
、リソースのライフ サイクルを自動的に管理できます。スマート ポインタがスコープ外になると、スマート ポインタが指すメモリは自動的に再利用されます。
std::unique_ptr<QImage> image(new QImage(buffer_width, buffer_height, QImage::Format_RGB888));
- リソース回復に QT オブジェクト ツリーを使用する: QT のオブジェクト モデルはメモリ管理に便利です。QT オブジェクトを作成するときに、他の QT オブジェクトを親として渡すことができます。親オブジェクトが削除されると、すべての子オブジェクトも自動的に削除されます。このように、オブジェクト ツリー内で関連する QT オブジェクトのグループをリンクすると、リソースの再利用が容易になります。
QLabel* label = new QLabel(this);
QPixmap* pixmap = new QPixmap(buffer_width, buffer_height);
label->setPixmap(*pixmap); // 'pixmap' will be deleted automatically when 'label' is deleted
- 動的メモリ割り当ては慎重に使用してください。不必要な動的メモリ割り当て操作を最小限に抑えます。場合によっては、動的メモリ割り当ての代わりにローカル変数または静的変数を使用できます。ただし、マルチスレッド環境で静的変数を使用するとデータ競合が発生する可能性があるため、注意して扱う必要があることに注意してください。
つまり、メモリ管理とリソース回復が、QT インターフェイスでのビデオ フレーム表示の正常な動作を保証するための鍵となります。これらのスキルを学習して使用することで、メモリ リークを効果的に回避し、プログラムの安定性とパフォーマンスを向上させることができます。
6.3 並列およびマルチスレッド処理の最適化
ビデオフレームの表示タスクにおいて、より高いパフォーマンスを追求したい場合には、並列コンピューティングとマルチスレッド技術を使用して最適化することが非常に効果的です。この章では、並列コンピューティングとマルチスレッド テクノロジを使用して、QT インターフェイスでのビデオ フレームの表示を最適化する方法について説明します。
- ビデオのデコードと表示のスレッドの分離: パフォーマンスを向上させるために、ビデオのデコードと表示のタスクを異なるスレッドに割り当てることができます。このようにして、デコード スレッドはビデオを継続的にデコードでき、表示スレッドはデコードされたフレームを独立してレンダリングできます。この並列処理により、相互の待機が回避され、パフォーマンスが向上します。Qt に付属のクラスを使用して
QThread
スレッドを作成できます。
class DecoderThread : public QThread {
// Implement decoder thread logic
};
class DisplayThread : public QThread {
// Implement display thread logic
};
DecoderThread decoder_thread;
DisplayThread display_thread;
decoder_thread.start();
display_thread.start();
- スレッド プールを使用してタスクを並列処理する: シナリオによっては、複数のビデオ ストリームを同時に処理する必要がある場合があります。パフォーマンスを向上させるために、スレッド プールを使用してこれらのタスクを並列処理できます。QT には
QThreadPool
スレッド プールを管理するためのクラスが用意されており、QRunnable
それから継承したクラスに解析タスクをカプセル化し、スレッド プールにタスクを追加できます。
class VideoTask : public QRunnable {
void run() override {
// Implement video processing logic
}
};
QThreadPool thread_pool;
VideoTask video_task_1;
VideoTask video_task_2;
thread_pool.start(&video_task_1);
thread_pool.start(&video_task_2);
- マルチスレッド レンダリング戦略: 高リフレッシュ レートまたは高解像度ビデオでは、レンダリング プロセスに時間がかかることがあります。レンダリングのパフォーマンスを向上させるために、レンダリング作業を複数のスレッドに分散することを検討できます。たとえば、カスタム描画を実装する場合、
QtConcurrent::run()
関数を使用してマルチスレッドの同時描画を実行できます。
void paintEvent(QPaintEvent* event) {
QtConcurrent::run(this, &VideoWidget::renderFrame);
}
void renderFrame() {
QPainter painter(this);
painter.drawImage(0, 0, your_qimage);
}
ただし、マルチスレッド レンダリングでは追加の同期やリソース競合の問題が発生する可能性があるため、実際には注意して扱う必要があることに注意してください。
並列コンピューティングとマルチスレッド技術を効果的に利用することで、QT インターフェイスでのビデオ フレーム表示のパフォーマンスを大幅に向上させることができます。ただし、実際のアプリケーションにリンクする場合は、具体的な状況に応じて実際の適用性と効果を比較検討し、独自のシーンに適した並列およびマルチスレッド戦略を選択する必要があります。
(7) 他の QT コンポーネントおよびライブラリとの統合
7.1 QT マルチメディア モジュール (QMultimedia) との統合
多くの場合、個々のビデオ フレームだけでなく、複雑なマルチメディア コンテンツも処理する必要があります。この場合、QT は、オーディオ、ビデオ、画像などのマルチメディア リソースを処理するための強力なマルチメディア モジュール QMultimedia を提供します。先ほど紹介したビデオ フレーム表示方法と QMultimedia モジュールを組み合わせることで、より強力なマルチメディア アプリケーションを実現できます。
まず、QMultimedia モジュールをインポートして、そのモジュールが提供する機能を使用する必要があります。.pro
以下をファイルに追加します。
QT += multimedia
次に、QMediaPlayer
ビデオを再生するオブジェクトを作成します。QMediaPlayer
クラスは、オーディオまたはビデオ コンテンツをロードして操作するための機能を提供します。
#include <QMediaPlayer>
QMediaPlayer* player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("path/to/your/video/file"));
player->play();
これで、プレーヤー オブジェクトが作成され、ビデオの再生が開始されました。次に、プレーヤーのビデオ出力を、前に説明したビデオ フレーム表示方法に接続する必要があります。ここでは、ビデオ出力をカスタムQAbstractVideoSurface
実装に接続する方法を示します。
まず、からオブジェクトをQMediaPlayer
取得しQVideoWidget
、それをQMediaPlayer
ビデオ出力として設定します。
#include <QVideoWidget>
QVideoWidget* videoWidget = new QVideoWidget;
player->setVideoOutput(videoWidget);
を継承し、や などのメソッドを実装するQAbstractVideoSurface
カスタム クラスを作成して、再生中に各フレームをキャプチャできるようにします。start()
stop()
present()
#include <QAbstractVideoSurface>
class CustomVideoSurface : public QAbstractVideoSurface {
Q_OBJECT
public:
CustomVideoSurface(QObject* parent = nullptr);
~CustomVideoSurface();
QList<QVideoFrame::PixelFormat> supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const override;
bool start(const QVideoSurfaceFormat& format) override;
void stop() override;
bool present(const QVideoFrame& frame) override;
};
このメソッドではstart()
、解像度やピクセル形式などのビデオ形式の詳細を取得できます。stop()
再生停止時にクリーンアップする方法。最も重要なメソッドはフレームごとに呼び出され、オブジェクトpresent()
を取得できます。QVideoFrame
CustomVideoSurface
クラスを実装した後、それをQMediaPlayer
ビデオ出力に接続します。
CustomVideoSurface* videoSurface = new CustomVideoSurface;
player->setVideoOutput(videoSurface);
これで、CustomVideoSurface
クラスはビデオのすべてのフレームをキャプチャし、自由に処理して表示できるようになります。このようにして、QT のビデオ フレーム表示メソッドを QMultimedia モジュールに統合することに成功しました。
7.2 OpenGL を使用した効率的なレンダリング
OpenGL は、2D および 3D グラフィックス出力を処理するためのクロスプログラミング言語、クロスプラットフォーム プログラミング インターフェイスです。多くの場合、ビデオ フレームの効率的な処理とレンダリングのために OpenGL を使用する必要があります。QT のビデオ フレーム表示メソッドと OpenGL を組み合わせることで、より高性能なビデオ アプリケーションを実現できます。
まず、OpenGL をサポートする QT ライブラリがインストールされていることを確認します。次に、.pro
プロジェクト ファイルに以下を追加します。
QT += opengl
次に、QOpenGLWidget
メインの OpenGL レンダリング ウィンドウとして機能するカスタム クラスを作成します。、およびメソッドをオーバーライドしてinitializeGL()
、初期化、ウィンドウのサイズ変更、レンダリングを処理できます。resizeGL()
paintGL()
#include <QOpenGLWidget>
class VideoGLWidget : public QOpenGLWidget {
Q_OBJECT
public:
VideoGLWidget(QWidget* parent = nullptr);
~VideoGLWidget();
protected:
void initializeGL() override;
void resizeGL(int width, int height) override;
void paintGL() override;
};
このメソッドではinitializeGL()
、シェーダーのセットアップやテクスチャのロードなど、OpenGL 環境の初期化操作を実行できます。resizeGL()
メソッドを使用してウィンドウのサイズ変更を処理し、ビデオ フレームを適切に拡大縮小できるようにします。最後に、paintGL()
メソッド内でビデオ フレームのテクスチャ操作を処理し、OpenGL 経由で描画します。
ビデオ フレームをクラスに渡すにはVideoGLWidget
、表示メソッドと前に紹介したビデオ フレーム処理メソッドを組み合わせる必要があります。たとえば、メソッドをオーバーライドしてビデオ フレームを取得するCustomVideoSurface
クラスを実装したとしますpresent()
。取得したオブジェクトをクラスQVideoFrame
に渡し、メソッド内でテクスチャを描画できます。VideoGLWidget
paintGL()
class VideoGLWidget : public QOpenGLWidget {
// 省略其他部分
public slots:
void updateVideoFrame(const QVideoFrame& frame);
protected:
void paintGL() override;
private:
QVideoFrame currentVideoFrame;
};
スロットではupdateVideoFrame()
、取得したビデオ フレームを OpenGL ウィンドウに渡し、paintGL()
メソッドでテクスチャを描画します。適切に描画するには、QVideoFrame
そのデータをテクスチャにアップロードする必要があることに注意してください (たとえば、glTexImage2D()
またはglTexSubImage2D()
関数を使用します)。
OpenGL を統合することで、効率的なリアルタイム レンダリングを実現し、GPU パフォーマンスを使用して複雑なビデオ操作を処理できます。これにより、高性能のクロスプラットフォーム ビデオ アプリケーションを開発するための基盤が築かれます。
7.3 QML との混合実装とメリットとデメリットの比較
QML は、JavaScript に基づくスクリプト言語を使用する記述的なユーザー インターフェイス言語です。QML を使用すると、動的で流動的なデータ駆動型のユーザー インターフェイスを簡単に作成できます。QT プロジェクトでは、QML と C++ の両方を使用して関数を実装し、両方の利点を組み合わせることができます。このセクションでは、ビデオ フレームの表示方法と QML を組み合わせる方法と、それに対応する利点と欠点について説明します。
まず、.pro
QML モジュールをプロジェクト ファイルに追加し、関連するヘッダー ファイルをインポートします。
QT += qml
次に、ビデオ フレームを表示するためのカスタム VideoOutput 要素を QML で作成します。
import QtQuick 2.0
Rectangle {
id: videoOutput
width: 640
height: 480
// 填充背景
color: "black"
}
QQuickItem
次に、ビデオ フレーム データを処理するために拡張される C++ クラスを作成します。
#include <QQuickItem>
class VideoOutputItem : public QQuickItem {
Q_OBJECT
public:
VideoOutputItem(QQuickItem* parent = nullptr);
~VideoOutputItem();
public slots:
void updateVideoFrame(const QVideoFrame& frame);
};
updateVideoFrame()
外部からのビデオフレームを受信するスロットを実装します。このメソッドでは、データQVideoFrame
に変換し、メソッドを使用して更新をリクエストする必要があります。QImage
QQuickItem
update()
次に、オーバーライドされたVideoOutputItem
メソッドupdatePaintNode()
:
QSGNode* updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* data) override;
updatePaintNode()
このメソッドではQImage
、データをQSGSimpleTextureNode
カスタム データに割り当てQSGNode
、結果を QML シーンにレンダリングします。
この方法により、QMLとC++を混合したビデオフレーム表示方法を実現できます。それぞれの主な利点と欠点は次のとおりです。
- QML の利点:
- 動的で流動的なユーザー インターフェイスを簡単に作成するための宣言型プログラミング
- GPUレンダリングをサポートし、パフォーマンスを向上させます
- QT Quick Components と統合して UI 構築プロセスを簡素化できます。
- QML の欠点:
- パフォーマンスは純粋な C++ 実装ほど高くない可能性があります
- 基礎となる機能の制御が低下する可能性がある
- QML と C++ の間のデータのやり取りは少し複雑になる可能性があります
- C++ の利点:
- 基盤となる制御機能の向上
- 特に低レベルの操作を実行する場合のパフォーマンスの向上
- 他の C++ ライブラリおよび API との統合が容易になりました。
- C++ の欠点:
- UI プログラミングはより複雑になる場合があります
- 動的でスムーズなユーザー インターフェイスを作成するのは QML ほど便利ではありません
QML と C++ の実装方法を組み合わせることで、両方の利点を最大限に活用して、より強力で保守が容易なビデオ フレーム表示アプリケーションを作成できます。
(8) 例: 簡単なビデオプレーヤーを実装する
8.1 ビデオのデコードと表示の基本プロセス
単純なビデオ プレーヤーを実装する場合、ビデオ デコードとビデオ フレーム表示という 2 つのコア リンクに注意を払う必要があります。
8.1.1 ビデオのデコード
デコードは、圧縮されたビデオ データを表示可能な画像フレームに変換するプロセスです。ビデオ デコードを実装するには、FFmpeg、GStreamer、またはその他の同様のライブラリなどのデコード ライブラリを使用する必要があります。以下は、簡略化されたデコード プロセスです。
- ビデオ ファイルを読み取り、デコーダを初期化します。まず、ターゲットのビデオ ファイルをロードし、ファイル形式に従ってデコーダを初期化する必要があります。複数のエンコード形式を処理するには、ファイルのメタデータをチェックして適切なデコーダを選択する必要があります。
- 解凍されたデータ: 圧縮されたビデオ データの場合、生のフレーム データを取得するために解凍する必要があります。
- 画像処理と変換: ニーズに応じて、クロップ、スケーリング、色空間変換など、解凍された画像フレームの処理が必要になる場合があります。
- 画像フレーム データを表示モジュールに渡す: デコードされた画像フレーム データは通常
QImage
、または他の同様のデータ構造に保存されており、QT インターフェイスで表示するためにビデオ表示モジュールに渡す必要があります。
8.1.2 ビデオフレーム表示
デコードが完了したら、QT インターフェイスで各画像フレームを表示し、フレーム レートと同期パフォーマンスが要件を満たしていることを確認する必要があります。この記事の前の方法を参照すると、次の 3 つの実装方法を選択できます。
- QLabel と QPixmap を使用します。シンプルで実装が簡単で、低フレーム レートのビデオに適しています。
QLabel* label = new QLabel;
label->setPixmap(QPixmap::fromImage(decoded_qimage));
- QPainter とカスタム描画を使用すると、高フレーム レートのビデオのパフォーマンスとカスタマイズが向上します。
class VideoWidget : public QWidget {
protected:
void paintEvent(QPaintEvent* event) override {
QPainter painter(this);
painter.drawImage(0, 0, decoded_qimage);
}
};
- QAbstractVideoSurface を使用する: 上級ユーザーに、複数のディスプレイのニーズに対応するためのより強力な制御機能を提供します。
class CustomVideoSurface : public QAbstractVideoSurface {
protected:
bool present(const QVideoFrame& frame) override {
// 绘制QImage
}
};
開発者は独自のニーズに応じて、適切な表示方法を選択して実装できます。同時に、ビデオとオーディオの同期を確保して、ユーザー エクスペリエンスを向上させます。
8.2 さまざまなシナリオに応じて適切なビデオ フレーム表示方法を選択する
シンプルなビデオ プレーヤーを設計する場合、プロジェクトの要件とターゲット プラットフォームのパフォーマンスに応じて、上記の 3 つのビデオ フレーム表示方法から選択する必要があります。このセクションでは、さまざまなシナリオの要件を分析し、推奨される表示方法を提供する方法を説明します。
8.2.1 低フレームレートと単純なシーン
ビデオ プレーヤーを使用して低フレーム レートのビデオを再生し、高度なレンダリング機能が必要ない場合は、QLabel および QPixmap の表示方法を選択できます。この方法は実装が簡単でコードが簡潔なので、初心者がすぐに始めるのに適しています。さらに、組み込みシステムや古いデバイスなど、計算負荷やレンダリング負荷が少なくて済む低パフォーマンスのデバイスの場合は、QLabel メソッドと QPixmap メソッドが適しています。
8.2.2 高フレーム レートおよび高パフォーマンスのシナリオ
高フレーム レートまたは 4K ビデオを処理する必要がある場合、またはリアルタイム レンダリング効果を実現する必要がある場合は、高いパフォーマンス要件が必要なシナリオで QPainter およびカスタム描画メソッドを使用することをお勧めします。カスタム QWidget を使用すると、描画プロセスを徹底的に最適化できるため、最新のハードウェアのパフォーマンスを最大限に活用できます。同時に、ビデオ フレーム表示のリフレッシュ レートがデコードされたビデオのフレーム レートと一致することを保証し、スムーズな再生エクスペリエンスを保証します。
8.2.3 多機能かつ高度な制御シナリオ
プロジェクトに、さまざまな画像形式の処理、エフェクト フィルターの適用、ビデオの透明度の変更などの複雑な機能要件が含まれている場合は、QAbstractVideoSurface を使用してビデオ フレームの表示を実現することをお勧めします。このアプローチにより、強力なカスタマイズ機能と基盤となるビデオ処理の制御が提供され、開発者が独自のニーズに応じて柔軟に調整および最適化できるようになります。
シーンの要件を分析し、パフォーマンス、使いやすさ、機能の拡張性に基づいて適切なビデオ フレーム表示方法を選択すると、シンプルなビデオ プレーヤーでより高いパフォーマンスと優れたユーザー エクスペリエンスを実現できます。
8.3 ユーザーインタラクションと再生制御の設計と実装
シンプルなビデオ プレーヤーを実装する場合、ユーザー インタラクションと再生制御機能が非常に重要です。このセクションでは、ビデオプレーヤーにインタラクティブなインターフェイスと再生制御機能を追加する方法を紹介します。
8.3.1 ユーザーインターフェースの構築
QT が提供するさまざまな UI コンポーネントを使用して、ビデオ プレーヤーのユーザー インターフェイスを構築できます。一般的な UI コンポーネントをいくつか示します。
- 再生/一時停止ボタン:
QPushButton
この実装を使用して、ボタンをクリックして再生と一時停止の機能を切り替えます。 - プログレスバー:
QSlider
ビデオ再生の進行状況を示すために使用されます。ユーザーは進行状況バーをクリックまたはドラッグして、再生位置を調整できます。 - 音量コントロール:
QSlider
音量を調整するために使用します。 - 全画面切り替え:
QPushButton
この実装を使用して、全画面モードとウィンドウ モードを切り替えます。
これらの UI コンポーネントをコントロール パネルに組み合わせると、ユーザーがこれらのコンポーネントを操作すると、信号とスロットのメカニズムを介して対応する機能に接続できます。
8.3.2 再生制御機能の実現
再生制御機能を実装するには、以下を処理する必要があります。
- 再生と一時停止: デコーダーの実行状態を制御することで、再生と一時停止の切り替えを実現できます。
void VideoPlayer::playPause() {
if (m_decoder->isPlaying()) {
m_decoder->pause();
} else {
m_decoder->play();
}
}
- ジャンプ再生: ユーザーが進行状況バーをクリックまたはドラッグすると、デコーダーに新しい再生位置が設定されます。
void VideoPlayer::seek(int position) {
m_decoder->setPosition(position);
}
- 音量の調整: ユーザーが音量スライダーを操作したときのプレーヤーの音量を設定します。
void VideoPlayer::setVolume(int volume) {
m_audioOutput->setVolume(volume / 100.0);
}
- 全画面再生の有効化/無効化: ユーザーが全画面ボタンをクリックすると、全画面モードとウィンドウ モードが切り替わります。
void VideoPlayer::switchFullscreen() {
if (isFullScreen()) {
showNormal();
} else {
showFullScreen();
}
}
上記の再生制御機能を実装することで、シンプルなビデオ プレーヤーが使いやすくなり、さまざまなユーザーのニーズを満たす柔軟な再生制御が提供されます。
(9) 拡張応用・高度化
9.1 QT ベースのクロスプラットフォーム ビデオ プレーヤー
Qt は効率的な C++ フレームワークとして、優れたクロスプラットフォーム機能を備えており、さまざまなオペレーティング システムやハードウェア プラットフォーム上で実行できます。上記で紹介したさまざまなビデオ フレーム表示方法に基づいて、Qt に基づいたクロスプラットフォームのビデオ プレーヤーを実装できます。このプレーヤーは、Windows、macOS、Linux、モバイル プラットフォーム (Android および iOS) などの複数のオペレーティング システムをサポートします。このセクションでは、Qt テクノロジーを使用してシンプルなクロスプラットフォーム ビデオ プレーヤーを構築する方法を紹介し、コア機能を実装するためのアイデアを提供します。
まず、クロスプラットフォームのビデオプレーヤーを設計するときは、Qt が提供するクロスプラットフォーム機能を最大限に活用する必要があります。コードの互換性を確保するには、特定のプラットフォームの特性に応じて適切なビデオ フレームの表示方法を選択する必要があります。たとえば、PC プラットフォームでは、高性能描画のために QPainter または QAbstractVideoSurface を選択でき、モバイル プラットフォームでは、ハードウェア アクセラレーションのために OpenGL を組み合わせることができます。
次に、クロスプラットフォーム コードを作成する場合は、次の点に注意する必要があります。
- Qt プログラミング仕様に従い、Qt が提供するクロスプラットフォーム API を使用します。コードの移植性を確保するために、基盤となるオペレーティング システムの API を直接呼び出すことは避けてください。
- Qt の定義済みマクロを使用して、プラットフォーム固有の特殊コードを処理します。たとえば、
#ifdef Q_OS_WIN
iso マクロを使用して、さまざまなプラットフォームのコードを区別できます。 - プラットフォーム固有の最適化には、C++ クラスの継承とオーバーロードを使用できます。たとえば、汎用ビデオ表示クラスを作成し、さまざまなプラットフォームにさまざまなサブクラスを実装します。
次に、プレーヤーのコア機能を構築します。ビデオ ファイルの解析とデコード、オーディオ処理、再生コントロール (再生、一時停止、早送りなど)、およびユーザー インターフェイスが含まれます。
- ビデオ ファイルの解析とデコード: サードパーティのライブラリ (FFmpeg など) を使用して、ビデオ ファイルの解析とデコードを実装できます。デコードされたビデオフレームをQImageに変換し、先ほど紹介した方法で表示します。
- オーディオ処理: Qt が提供する QAudioOutput クラスを使用して、デコードされたオーディオ フレームを再生できます。
- 再生制御:ユーザーの操作に応じて、再生、一時停止、早送りなどの機能を実現できます。再生制御を実装する場合、Qt のシグナルとスロットのメカニズムを使用してユーザー操作に応答し、マルチスレッド処理によってオーディオとビデオの同期を実現できます。
- ユーザー インターフェイス: Qt は、優れたユーザー エクスペリエンスを備えたプレーヤー インターフェイスを簡単に作成できる、豊富な UI コンポーネントのセットを提供します。クロスプラットフォームをベースに、さまざまなプラットフォーム向けにUIデザインをカスタマイズできます。
上記の手順により、Qt に基づいたシンプルなクロスプラットフォーム ビデオ プレーヤーを実装できます。将来的には、字幕の追加やプレイリストの実装など、さらに機能が拡張される可能性があります。つまり、成熟したクロスプラットフォーム フレームワークとして、Qt は開発者に強力なツールと豊富なコンポーネントを提供し、Qt ベースのクロスプラットフォーム ビデオ プレーヤーは開発の難易度を大幅に軽減し、開発効率を向上させます。
9.2 人工知能と画像処理技術の統合
人工知能と画像処理技術の発展に伴い、これらの技術をビデオプレーヤーに応用する例が増えています。これらの機能により、ユーザーはより豊かな視聴体験を得ることができます。このサブセクションでは、人工知能と画像処理テクノロジーを Qt ベースのビデオ プレーヤーに統合する方法を検討し、いくつかの実用的な例を示します。
Qt ビデオ プレーヤーに人工知能と画像処理テクノロジを統合する場合、次の 2 つの方向が考慮されます。
- グローバルな処理と最適化: 人工知能と画像処理テクノロジーを使用することで、画質の最適化、フレーム補償、色調整などの機能をビデオ再生プロセス全体で実現できます。たとえば、超解像技術 (Super-Resolution) を使用すると、低解像度ビデオの品質を向上させることができます。これらの関数を実装すると、デコードされた QImage を直接処理でき、処理された画像フレームを上で紹介したビデオ フレーム表示メソッドに渡すことができます。さらに、Qt によって提供される画像処理クラス (QImage や QPixmap など) と並列コンピューティング テクノロジ (QtConcurrent) を使用して、パフォーマンスを最適化できます。
- AI 支援機能: ビデオ プレーヤーを作成するときに、ユーザーと対話するいくつかの人工知能機能を追加することもできます。たとえば、顔認識技術を使用して、再生の自動一時停止やプレーヤー内のキャラクターの自動配置などの機能を実装できます。さらに、音声認識および合成技術を統合して、音声制御や再生などの機能を実現することもできます。これらの機能は、人工知能フレームワーク (TensorFlow など) または画像処理ライブラリ (OpenCV など) を呼び出すことで実装できます。
人工知能と画像処理テクノロジーを統合する例をいくつか示します。
- ビデオ品質の向上: 低解像度のビデオに超解像処理が実行され、画質が向上します。モデルは、畳み込みニューラル ネットワークや敵対的生成ネットワークなどの深層学習技術を使用してトレーニングし、ビデオ フレームに適用できます。
- 動的フレーム補正: 高速アクションや手ぶれのあるビデオを再生する場合、フレーム補正テクノロジーを使用してフレーム損失の問題を解決できます。たとえば、オプティカル フロー推定方法を使用して、欠落したフレームの内容を予測し、それらをビデオ シーケンスに埋め込むことができます。
- スマートな字幕と音声認識: 自然言語処理と音声認識テクノロジーを使用して、ビデオ内に字幕を自動的に生成します。さらに、ビデオには音声合成技術を通じて多言語のオーディオトラックが提供されます。このように、ユーザーは設定オプションを通じてビデオの言語バージョンを自由に切り替えることができます。
- コンテンツの推奨と分析: ユーザーの視聴習慣とビデオ コンテンツに基づいて、機械学習モデルを使用して、より類似したビデオをユーザーに推奨します。さらに、センチメント分析などのテクノロジーを使用してビデオ内の会話や行動を分析し、より正確なキーワード検索や視聴の提案をユーザーに提供します。
人工知能と画像処理テクノロジーを組み合わせた Qt ベースのビデオ プレーヤーは、ユーザーにさらに革新的な機能と優れた視聴体験を提供します。もちろん、これらのテクノロジーは実用的な機能を提供するだけでなく、プレーヤーのパフォーマンスと安定性を確保するためにバランスを取る必要があります。
9.3 高度なビデオ編集およびリアルタイム合成ツールの開発
ビデオ処理の分野には、プレーヤー以外にも、ビデオ編集やリアルタイム合成など、興味深いアプリケーション シナリオが数多くあります。Qt のクロスプラットフォーム特性とインターフェイス プログラミングの利便性に基づいて、上で説明したビデオ フレーム表示方法に基づいた高度なビデオ編集およびリアルタイム合成ツールを開発できます。このセクションでは、ビデオ編集およびリアルタイム合成機能の実装アイデアをいくつか示し、Qt テクノロジーに基づいてそのようなツールを構築する方法の経験を共有します。
まず、ビデオ編集ツールとリアルタイム合成ツールが実装する必要がある機能をいくつかリストします。これには以下が含まれますが、これらに限定されません。
- 基本的なビデオ編集機能: カット、ステッチ、回転、ズーム、速度調整など。
- ビデオ効果とフィルターの適用: さまざまな視覚効果の追加、明るさ、コントラスト、色の調整、フィルターの追加など。
- オーディオの処理と編集: 音量の調整、フェードインとフェードアウト、ノイズの除去、音響効果の追加など。
- 字幕と注釈: 字幕、テキスト、矢印、グラフィックス、その他の注釈情報をビデオに追加します。
- リアルタイムのプレビューとレンダリング: 編集効果をすばやくプレビューし、さまざまな品質と形式でビデオをエクスポートします。
次に、これらの関数を Qt ベースのツールに実装する方法について説明します。
- プレーヤーに基づいて拡張する: 前の記事で説明したビデオ フレーム表示方法を基礎として使用して、より複雑なビデオ編集およびリアルタイム合成ツールを開発します。このうち、プレーヤー内のデコード、表示、音声処理部分はこれに基づいて拡張できます。
- Qt のグラフィックスおよびアニメーション機能を活用する: Qt には、QGraphicsScene や QGraphicsItem などの強力なグラフィックスおよびアニメーション機能があり、テキストやグラフィックスなどの編集オブジェクトを簡単に追加および変換できます。さらに、ブラシ、消しゴム、トリミングなどのカスタム グラフィック操作ツールを追加およびカスタマイズできます。
- リアルタイム プレビューおよびレンダリング機能の実装: ビデオ編集およびリアルタイム合成ツールにリアルタイム プレビュー機能が実装されており、ユーザーは編集効果をすばやく確認できます。ダブルバッファリングテクノロジーを使用してプレビューのパフォーマンスを向上させると同時に、マルチスレッドを最大限に活用して効率的なレンダリングを行うことができます。
- サードパーティ ライブラリの統合: 開発プロセス中に、いくつかの成熟したサードパーティ ライブラリを統合して、ビデオ処理および特殊効果機能を実現できます。たとえば、ビデオのデコードとエンコードには FFmpeg を使用し、画像処理と視覚効果には OpenCV を使用します。
- クロスプラットフォームとパフォーマンスの最適化: 高度なビデオ編集ツールやリアルタイム合成ツールを開発する場合、Qt が提供するクロスプラットフォーム機能を最大限に活用して、ツールがさまざまなオペレーティング システムやハードウェア プラットフォームで安定して動作するようにする必要があります。さらに、メモリ管理、マルチスレッド、GPU アクセラレーションなどのパフォーマンスの最適化にも注意を払う必要があります。
Qt ベースのビデオ編集およびリアルタイム合成ツールは、Qt のクロスプラットフォームの利点を最大限に活用しながら、さまざまなアプリケーション シナリオにおけるビデオ処理要件を満たすことができます。ビデオフレームの表示方法を検討することで、豊富な機能と使いやすさ、安定したパフォーマンスを備えたビデオ編集・リアルタイム合成ツールを開発できます。
(10) まとめと展望
10.1 この論文の概要
この記事では、Qt を使用してビデオ フレームを表示する 3 つの主な方法、つまり QLabel と QPixmap の使用、QPainter とカスタム描画の使用、QAbstractVideoSurface の使用について説明しました。さまざまなシーンの要件に応じて、ビデオ フレームを処理する際のさまざまな方法の長所、短所、および適用可能性を分析しました。
まず、QImage を QPixmap に変換して QLabel に表示する方法を紹介しましたが、この方法はシンプルで実装は簡単ですが、高フレームレートのビデオの処理には適していない可能性があります。次に、カスタム QWidget を作成し、そのPaintEvent() 関数をオーバーライドすることで、ビデオ フレーム描画に QPainter を使用する方法について説明しました。この方法は、より多くのカスタム描画機能と高フレーム レートの処理を必要とするシーンに適しています。最後に、ビデオ フレームを操作する機能をより詳細に制御できる QAbstractVideoSurface の使用を検討しました。
実際のアプリケーションについて議論する中で、高フレーム レートのビデオ、特定のデバイスの適応性、ビデオ効果の処理、リアルタイムのビデオ ストリーム表示など、さまざまなシナリオで適切な方法を選択する方法を分析しました。次に、リフレッシュ レートと同期戦略の選択、メモリ管理とリソース回復、並列処理とマルチスレッド処理の最適化など、パフォーマンスの最適化と手法を整理しました。
さらに、マルチメディア処理のための QMultimedia モジュールの使用、OpenGL による効率的なレンダリング、QML によるハイブリッド実装など、Qt と他のコンポーネントやライブラリとの統合についても検討します。最後に、簡単なビデオプレーヤーの例を使用して、シーンに応じて適切なビデオフレーム表示方法を選択する方法を示し、QT ビデオフレーム処理技術の拡張応用および高度な方向への発展の可能性について説明します。
10.2 将来の開発動向と研究の方向性
技術の継続的な発展により、QT ビデオ フレーム表示テクノロジには、将来的に検討する価値のある多くの分野と研究の方向性がまだあります。次の点が将来の QT ビデオ フレーム処理テクノロジの焦点になる可能性があります。
- ハードウェア アクセラレーションと高性能レンダリング: ハードウェア パフォーマンスの向上、特に GPU 処理能力の強化に伴い、ハードウェア アクセラレーションと高性能レンダリング テクノロジをさらに使用して、より効率的でスムーズなビデオ フレーム表示を実現します。
- 仮想現実と 3D ビジョン技術: 仮想現実と 3D ビジョンの分野では、QT ビデオ フレーム表示技術に基づいて、より高度なアプリケーションをどのように開発するかが、挑戦的な研究方向となります。
- インタラクティブ性とリアルタイム パフォーマンスの向上: リアルタイム ビデオ ストリーム処理テクノロジの進歩により、市場で高まるリアルタイム ビデオ レンダリングの需要を満たすために、より高いリアルタイム性と優れたユーザー インタラクション エクスペリエンスを実現できます。
- クロスプラットフォーム互換性とスケーラビリティ: クロスプラットフォーム互換性は、将来的にも (Qt) ビデオ フレーム表示テクノロジの重要な研究方向であり、異なるプラットフォーム間の適応と統合方法を改善することで、より多くのプラットフォームとデバイスで実現できます。 QTビデオフレーム処理テクノロジーを適用します。
- インテリジェンスとパーソナライゼーション: 人工知能、機械学習、その他の分野を組み合わせて、QT ビデオ フレーム表示テクノロジーにインテリジェントでパーソナライズされた機能を追加します。たとえば、よりインテリジェントなビデオ処理効果の実現や、最高のビデオ再生エクスペリエンスを提供するためのユーザー ニーズの自動識別などです。
これらの開発傾向と研究の方向性は、QT ビデオ フレーム表示技術の適用範囲を拡大し、QT 技術を促進してビデオ処理分野でのさらなる進歩を達成するのに役立ちます。
10.3 QTビデオフレーム処理技術への期待と展望
今後もQTビデオフレーム処理技術に大きな期待が寄せられています。映像処理分野におけるQTの利点を最大限に発揮し、開発者やユーザーにより豊かなアプリケーションエクスペリエンスを提供できるよう、実用化や技術探索においても引き続き技術革新と改良を推進していきたいと考えております。具体的な期待には次のようなものがあります。
- より高いパフォーマンスと安定性: QT テクノロジーがビデオ フレーム処理の分野でパフォーマンスを最適化し、さまざまなシナリオや負荷の処理における安定性を確保できることが期待されています。
- より使いやすい開発ツールとチュートリアル: QT は、開発者が学習して適用する敷居を下げるために、より使いやすい開発ツールと詳細なチュートリアル ドキュメントをリリースすることが期待されています。
- より広範なクロスプラットフォームのサポートと互換性: QT ビデオ フレーム処理テクノロジがより多くのプラットフォームとデバイスをサポートできるようになり、それによって世界規模でさまざまなアプリケーションへの適用が促進されることが期待されています。
- より強力な拡張機能と統合機能: QT は、他のテクノロジーやフレームワークとより適切に統合し、さまざまな革新的なアプリケーションのニーズを満たすために、ビデオ フレーム処理テクノロジーの機能をさらに強化できることが期待されています。
- 技術開発の動向に引き続き注意を払い、イノベーションを促進する: QT がビデオ処理分野の技術開発のペースに追いつき、独自の技術システムを常に更新および最適化し、革新的なアプリケーションの開発を継続して、業界全体の進歩。
継続的な努力と追求を通じて、QT はビデオ フレーム処理技術の分野でさらなる進歩と成果を達成し、開発者とユーザーにさらにエキサイティングなアプリケーション エクスペリエンスをもたらすと信じています。