[Windows,Qt5,QMediaPlayer,QMediaPlaylist]:当前视频源更改时的微小持续时间黑屏

时间:2015-11-02 07:38:39

标签: windows qmediaplayer qtmultimedia qt5.5

我正在用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();
}

有两个问题:
1.更改位置时

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

有一点延迟(我的客户可以接受这个,但顺利更好)
2.当视频源改为:

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

客户端并不想要一个持续时间很短的黑屏。他希望效果至少与更改位置时相同:

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

在Windows上使用Qt5更改视频源时,我们可以删除此黑屏吗?或者我们可以使用其他库/框架(在更改视频源时播放没有黑屏间隙的视频列表)? (在MacOs上,切换顺畅)
非常感谢你!

1 个答案:

答案 0 :(得分:2)

这是QtMediaPlayer中报告的bug,它只发生在Windows上。在当前的API中,当媒体到达终点时,播放器清除视频区域以播放下一个媒体。转换不是无缝的,会导致无效的帧。作为循环视频中的变通方法,可以将位置更改为相同媒体中的所需帧。

如果您需要更换媒体,可以尝试使用两个媒体播放器对象,一个用于当前媒体,另一个用于下一个媒体。当播放下一个媒体时,该播放器的位置变为0并在小部件上显示。在bug报告的链接中说明了那个。它很混乱,仍然不是一个完整的解决方案。

那么,该怎么办?

  1. 您可以等待Qt修复。 Bug似乎在2-3个月前报道过。

  2. 更改媒体播放器(Gstreamer具有无间隙/无缝视频支持) 您肯定可以在使用Qt开发的UI中嵌入媒体播放器。有examples

  3. 移动另一个提供更好媒体播放功能的UI库。

  4. 我会按2-1-3的顺序去。尝试嵌入另一个媒体播放器,并允许他们几个月来修复错误。