Qt 6 で QtMultimedia が生まれ変わります
Qt の開発者用のメーリングリスト に Qt のチーフメンテナから New QtMultimedia という投稿がありました。
Qt Multimedia は Qt 6.0 のリリースには入らず、2021年末にリリース予定の 6.2 で正式リリースとなる予定ですが、大規模な改修がなされ、よりよい形で提供されることになります。
QtMultimedia は、動画や音声の再生、カメラからの画像や映像の取り込み、ラジオなど、マルチメディアの機能を提供するモジュールで、他の Qt のモジュールと同様、クロスプラットフォームの API を提供し、バックエンドは各プラットフォーム固有のマルチメディアのフレームワーク(gstreamer や AVFoundation など)を利用します。
Qt 4 の後期に誕生し、Qt 5 では第一線で活躍してきましたが、設計や実装の問題がそれなりにあり、Qt 6 で大規模に改善することにしたようです。(Lars なんでもやるなー)
現時点で、Qt 5.15 では 140k LOC だったものが 7.3k にまで減らすことに成功し、機能的には 90 % 程度提供できているということで、すごいですね。
変更の概要
- QMediaDevices クラスを追加し、デバイスの管理や変更通知に対応
- QMediaFormat クラスを追加し、対応するファイル形式やフォーマットを取得可能に
- 再生系の API を見直し、QMediaPlayer とプレイリストを完全に分離
- QMediaPlayList を QUrl ベースの API に書き換えシンプルに
- 音声/映像/字幕の複数のストリームに対応
- メタデータまわりの改善
- QMediaCaptureSession クラスを追加し、キャプチャー関連の機能を集約
- QCamera と QMediaEncoder、QMediaImageCapture は上記と連携するように
- QCameraFocus と QCameraExposure、QCameraImageProcessing を削除し機能は QCamera に移行
- QMediaEncoder でキャプチャした音声/映像をエンコードが可能に
- QMediaEncoderSettings で上記の設定ができるように
- QML 向けの API を大規模に改善
- 動画再生のパイプラインを作り直し、QVideoSink という新しいクラスがその役割を担当するように
- 非圧縮形式(RGB や YUV)などの QPainter やシェーダーでの描画のビルトイン対応
- 映像の各フレームを QImage に変換できるように
- QML の VideoOutput への描画の RHI を使ったハードウェアアクセラレート対応
- QAudioDecoder で音声のデコードをクロスプラットフォームに対応
- バックエンドの API を Private 化し、当面は自由に機能の拡張などができるように
- QMediaService/QMediaObject の抽象クラスを削除
- バックエンドのプラグイン形式をやめ、コンパイル時に決定するように
- QAudioProve/QVideoProbe の API の削除
- QSound も廃止し QSoundEffect へ移行
- Radio API は削除
- QAudioRecorder も廃止し QMediaCaptureSession/QMediaEncoder もしくは QMediaRecorder へ移行
- QAbstractVideoFilter を廃止し、ShederEffects へ移行
- QAbstractVideoSurface を廃止し QVideoSink へ
- QVideoSurfaceFormat は QVideoFrameFormat に名前を変えた
- 40以上あったバックエンド向けの API を 13 個にまで減らした
- gstreamer のプラグインをゼロから書き直して、base と good にのみ依存するように
- gstreamer の codec はそれぞれ必要な時にのみ利用するように
- Windows は WMF を使うようにし、カメラにも対応
現時点ではまだまだやることはたくさん残っていますが、6.2 のリリースに向けて引き続き作業を続けていくとのことです。
個人的にも Qt Multimedia は、そろそろ限界だなと思っていたところなので、こうやって新しく生まれ変わってくれて、本当にうれしいなと思っています。