2

私がやりたいことは、ある時点 (たとえば 20 秒) でビデオ フレームを取得することです。私はこのようなことができることを知っています-ビデオを巻き戻して一時停止します:

QMediaPlayer* player = new QMediaPlayer;
...
player->play();
player->setPosition(20000);
player->pause();

しかし、もっとエレガントな解決策はありますか(ビデオ全体ではなく、ある時点でフレームだけが必要なので、これはハックのように思えます)?

4

1 に答える 1

6

以下の手順は、ビデオ ファイルからフレームをキャプチャするのに役立ちます。

プロジェクトレベル

  1. QT += マルチメディア

コードレベル

  1. QMediaplayer オブジェクトを開始します(QMediaPlayer(QObject 親、QMediaPlayer::VideoSurface)
  2. QMediaplayer.setVideoOutput を (QAbstractVideoSurface のサブクラス) に設定します。
  3. QAbstractVideoSurface のサブクラスは、メソッド supportedPixelFormats、isFormatSupported、start、present を再実装する必要があります。4.present メソッドから
    フレームの画像バッファを取得できます。
  4. QMediaplayer を使用してビデオ ファイルをロードします。
  5. setMute = true(オーディオ)
  6. 必要な位置をミリ秒単位で QMediaplayer オブジェクトに設定します
  7. プレイ開始方法
  8. 現在のメソッドから、受信したデータ バッファーを QImage に変換し、次に QPixmap (必要な場合) に変換します。
  9. ピックスマップを取得したら、それを使用してウィジェットにロードします (例: QLabel 内)。
  10. ビデオ ファイルの再生をすぐに一時停止します (他のフレームをキャプチャする必要がある場合。それ以外の場合は、pause() の代わりに stop() を使用します)。これは、サブクラスのオブジェクト (QAbstractVideoSurface) から QMediaPlayer オブジェクトへのシグナルスロットを使用して実行できます。
  11. 完了したら、QAbstractVideoSurface のサブクラスの停止メソッドを呼び出してから、QMediaplayer を呼び出します

上記のサンプルアプリケーションはここにあります

(アプリケーションのスクリーンショット)

ここに画像の説明を入力

ビデオ ファイルを開く : ビデオ ファイルを参照して選択します
スライダー : 必要な位置を選択します
キャプチャ : 画像をキャプチャして QLabel で表示し
ます 保存 : キャプチャした画像を保存します

于 2016-07-20T14:45:39.530 に答える