Qt GUI で動画を再生する2つの方法:QMovie::setFormat() と QMediaReader


QMovie::setFormat()関数は、Qt GUIにおけるQMovieクラスで、動画ファイルのフォーマットを指定するために使用されます。QMovieクラスは、GIFやPNGなどの静止画像フォーマットを含む、様々な動画フォーマットを扱うことができます。

構文

void QMovie::setFormat(const QByteArray &format);

パラメータ

  • format: 動画ファイルのフォーマットを表すQByteArray型の変数。フォーマット名は、大文字と小文字を区別する必要があります。

戻り値

なし

詳細

QMovie::setFormat()関数は、動画ファイルの読み込み前に呼び出す必要があります。フォーマットを指定しないと、QMovieクラスは自動的にフォーマットを推測しようとしますが、常に正しい結果が得られるとは限りません。

動画ファイルのフォーマットがわからない場合は、QImageReader::supportedImageFormats()関数を使用して、サポートされているフォーマットのリストを取得することができます。

QMovie movie;
movie.setFileName("my_movie.gif");

// GIFフォーマットを指定
movie.setFormat("GIF");

// 動画の読み込み
movie.start();
  • 動画ファイルのフォーマットが間違っていると、QMovie::error()シグナルがemitされます。
  • QMovie::setFormat()関数は、動画ファイルが既に読み込まれている場合は呼び出しても効果がありません。


GIF 動画を読み込む

#include <QApplication>
#include <QMovie>
#include <QLabel>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QLabel ウィジェットを作成
  QLabel label;

  // GIF ファイル名を設定
  QString fileName = "my_movie.gif";

  // QMovie オブジェクトを作成
  QMovie movie(fileName);

  // GIF フォーマットを指定
  movie.setFormat("GIF");

  // 動画を読み込み
  movie.start();

  // QLabel ウィジェットに動画を表示
  label.setMovie(&movie);
  label.show();

  return app.exec();
}

PNG シーケンス動画を読み込む

#include <QApplication>
#include <QMovie>
#include <QLabel>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QLabel ウィジェットを作成
  QLabel label;

  // PNG シーケンスファイル名を設定
  QString fileName = "my_movie.png";

  // QMovie オブジェクトを作成
  QMovie movie(fileName);

  // PNG フォーマットを指定
  movie.setFormat("PNG");

  // 動画を読み込み
  movie.start();

  // QLabel ウィジェットに動画を表示
  label.setMovie(&movie);
  label.show();

  return app.exec();
}

このコードは、"my_movie.png" という名前の PNG シーケンス動画を読み込み、QLabel ウィジェットに表示します。

#include <QApplication>
#include <QMovie>
#include <QLabel>
#include <QImageReader>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QLabel ウィジェットを作成
  QLabel label;

  // 動画ファイル名を設定
  QString fileName = "my_movie.mov";

  // QMovie オブジェクトを作成
  QMovie movie(fileName);

  // 動画ファイルのフォーマットを取得
  QImageReader reader(fileName);
  QByteArray format = reader.format();

  // 取得したフォーマットを QMovie::setFormat() 関数に設定
  movie.setFormat(format);

  // 動画を読み込み
  movie.start();

  // QLabel ウィジェットに動画を表示
  label.setMovie(&movie);
  label.show();

  return app.exec();
}


QMovie::setFormat() 関数は、Qt GUI において動画ファイルのフォーマットを指定するために使用されます。しかし、状況によっては QMovie::setFormat() 関数よりも適切な代替方法が存在する場合があります。

代替方法

  1. QMediaReader クラスを使用する

QMediaReader クラスは、様々な種類のメディアファイルを再生するための汎用的なクラスです。QMovie::setFormat() 関数よりも柔軟性が高く、エラー処理も容易です。

#include <QMediaReader>
#include <QMediaPlayer>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QLabel ウィジェットを作成
  QLabel label;

  // 動画ファイル名を設定
  QString fileName = "my_movie.mp4";

  // QMediaReader オブジェクトを作成
  QMediaReader reader(fileName);

  // QMediaPlayer オブジェクトを作成
  QMediaPlayer player;
  player.setMedia(&reader);

  // 動画を再生
  player.play();

  // QLabel ウィジェットに動画を表示
  label.setVideoWidget(player.videoWidget());
  label.show();

  return app.exec();
}
  1. QImageReader クラスを使用する

QImageReader クラスは、静止画像フォーマットだけでなく、GIF や PNG シーケンスなどの動画フォーマットも読み込むことができます。

#include <QApplication>
#include <QLabel>
#include <QImageReader>
#include <QTimer>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QLabel ウィジェットを作成
  QLabel label;

  // PNG シーケンスファイル名を設定
  QString fileName = "my_movie.png";

  // QImageReader オブジェクトを作成
  QImageReader reader(fileName);

  // フレームレートを設定 (1 秒あたり 10 フレーム)
  int frameRate = 10;

  // QTimer オブジェクトを作成
  QTimer timer;
  timer.setInterval(1000 / frameRate);

  // タイマーシグナルを接続
  connect(&timer, &QTimer::timeout, [&]() {
    // 次のフレームを読み込む
    QImage image = reader.nextImage();

    // 読み込みが完了したらループを終了
    if (image.isNull()) {
      timer.stop();
      return;
    }

    // QLabel ウィジェットに画像を表示
    label.setPixmap(image.scaled(label.size(), Qt::KeepAspectRatio));
  });

  // タイマーを開始
  timer.start();

  label.show();

  return app.exec();
}
方法メリットデメリット状況
QMovie::setFormat()シンプルでわかりやすい柔軟性がない、エラー処理が難しい動画ファイルのフォーマットがわかっている場合
QMediaReader柔軟性が高く、エラー処理が容易QMovie::setFormat() よりも複雑様々な種類のメディアファイルを再生する場合
QImageReaderGIF や PNG シーケンス動画を再生する場合に有効フレームレートを手動で設定する必要がある静止画像フォーマットを含む動画フォーマットを再生する場合