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

Posted

技术标签:

【中文标题】[Windows,Qt5,QMediaPlayer,QMediaPlaylist]:当前视频源更改时的微小持续黑屏【英文标题】:[Windows, Qt5, QMediaPlayer, QMediaPlaylist]: Tiny duration black screen when the current video source changed 【发布时间】:2015-11-02 07:38:39 【问题描述】:

我正在用 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 更改视频源时,我们可以消除这个黑屏吗?或者我们可以使用其他库/框架来执行此操作(在更改视频源时播放没有黑屏间隙的视频列表)? (在 MacO 上,切换流畅) 非常感谢!

【问题讨论】:

这是一个相对的问题:***.com/questions/27517619/… 我有一些使用 QMediaGaplessPlaybackControl 的提示,但我没有成功 【参考方案1】:

这是 QtMediaPlayer 中报告的bug,它仅在 Windows 上出现。在当前的 API 中,当一个媒体结束时,播放器会清除视频区域以播放下一个媒体。过渡不是无缝的并导致无效帧。作为循环视频中的一种解决方法,可以将位置更改为相同媒体中的所需帧。

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

那么,该怎么办?

    您可以等待 Qt 修复。错误似乎是 2-3 个月前报告的。

    更改媒体播放器(Gstreamer 支持无缝/无缝视频) 您当然可以在使用 Qt 开发的 UI 中嵌入媒体播放器。有examples。

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

我会选择 2-1-3 的顺序。尝试嵌入另一个媒体播放器,并等待几个月的时间让他们修复错误。

【讨论】:

以上是关于[Windows,Qt5,QMediaPlayer,QMediaPlaylist]:当前视频源更改时的微小持续黑屏的主要内容,如果未能解决你的问题,请参考以下文章

QMediaPlayer 在 qt5 中不起作用

在 Qt5 中使用 QMediaPlayer 播放流时使用代理? [复制]

哪些视频文件可以在 Android 上播放 QMediaPlayer?

QMediaPlayer 中播放声音的内部扩展

QMediaPlayer - 播放 youtube 音乐

QMediaPlayer 在 Ubuntu 16.04 / Qt 5.6 上不播放任何内容