1

Qt5::QMediaPlayer を使用してビデオ プレーヤーを作成し、次のようにランダムな期間、ランダムにいくつかのビデオを再生します。

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

    QMediaPlaylist* playlist = new QMediaPlaylist(&a);
    playlist->addMedia(QUrl::fromLocalFile("./Resources/fractal-files/A-060405V4651.WMV"));
    playlist->addMedia(QUrl::fromLocalFile("./Resources/fractal-files/E-102604.WMV"));
    playlist->addMedia(QUrl::fromLocalFile("./Resources/fractal-files/C-102304.WMV"));

    QMediaPlayer* player = new QMediaPlayer(&a);
    player->setPlaylist(playlist);

    QVideoWidget* videoWidget = new QVideoWidget;
    player->setVideoOutput(videoWidget);

    player->play();
    videoWidget->show();

    QTimer* t = new QTimer;
    QObject::connect(t, &QTimer::timeout, [&](){
        playlist->setCurrentIndex(playlist->nextIndex());
        player->play();
        videoWidget->setWindowTitle(playlist->currentMedia().canonicalUrl().fileName());
        t->start((qrand()%5 + 5)*1000);
    });
    t->start((qrand()%5 + 5)*1000);

    QTimer* t2 = new QTimer;
    QObject::connect(t2, &QTimer::timeout, [&](){
        player->setPosition(qrand() % player->duration());
        videoWidget->setWindowTitle(playlist->currentMedia().canonicalUrl().fileName());
        t2->start((qrand()%2 + 2)*1000);
    });
    t2->start((qrand()%2 + 2)*1000);

    return a.exec();
}

2 つの問題があります
。 1. 位置を変更する場合

player->setPosition(qrand() % player->duration());

少し遅延があります (私のクライアントはこれを受け入れることができますが、スムーズな方が良いです)
2. ビデオ ソースが次のように変更された場合:

playlist->setCurrentIndex(playlist->nextIndex());
player->play();

クライアントが望んでいない短時間の黒い画面があります。彼は、少なくとも位置を変更したときと同じ効果を望んでいます。

player->setPosition(qrand() % player->duration());

Windows で Qt5 を使用してビデオ ソースを変更すると、この黒い画面を削除できますか? または、他のライブラリ/フレームワークでこれを行うことができますか (ビデオ ソースを変更するときに黒い画面のギャップなしでビデオのリストを再生します)? (MacOSでは切り替えがスムーズです)
ありがとうございます!

4

1 に答える 1

3

これはQtMediaPlayer で報告されたバグであり、Windows でのみ発生します。現在の API では、メディアが最後に到達すると、プレーヤーはビデオ領域をクリアして次のメディアを再生します。トランジションはシームレスではなく、無効なフレームが発生します。ループ ビデオの回避策として、位置を同じメディア内の目的のフレームに変更できます。

メディアを変更する必要がある場合は、現在のメディア用と次のメディア用の 2 つの mediaplayer オブジェクトを使用してみてください。次のメディアを再生する時間になったら、そのプレーヤーの位置を 0 に変更し、ウィジェットに表示します。それはバグレポートのリンクに記載されています。それは厄介で、まだ完全な解決策ではありません。

じゃあ何をすればいいの?

  1. Qt の修正を待つことができます。バグは 2 ~ 3 か月前に報告されたようです。

  2. メディア プレーヤーの変更 (Gstreamer はギャップレス/シームレス ビデオをサポートしています) Qt で開発した UI にメディア プレーヤーを確実に埋め込むことができます。あり。

  3. より優れたメディア再生機能を提供する別の UI ライブラリに移動します。

私は2-1-3の順番で行きます。別のメディア プレーヤーを埋め込んでみて、バグが修正されるまで数か月かかります。

于 2016-03-19T17:02:49.977 に答える