首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[Windows,Qt5,QMediaPlayer,QMediaPlaylist]:当当前视频源改变时,微小的持续时间黑色屏幕

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

Stack Overflow用户
提问于 2015-11-02 07:38:39
回答 1查看 1.8K关注 0票数 1

我正在用Qt5::QMediaPlayer编写一个视频播放器,随机播放一些视频,时间为:

代码语言:javascript
复制
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. 当改变位置时
代码语言:javascript
复制
player->setPosition(qrand() % player->duration());

有一点延迟(我的客户可以接受,但顺利更好)

  1. 当视频源更改时:
代码语言:javascript
复制
playlist->setCurrentIndex(playlist->nextIndex());
player->play();

有一个小的持续时间黑色屏幕,客户不想要。他想要的效果至少和改变位置时一样:

代码语言:javascript
复制
player->setPosition(qrand() % player->duration());

在Windows上用Qt5更改视频源时,我们能删除这个黑屏幕吗?或者我们可以使用其他库/框架(在更改视频源时播放一个没有黑屏幕间隙的视频列表)?(在MacOs上,切换是平滑的)

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2016-03-19 17:02:49

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

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

那么,该怎么办?

  1. 您可以等待Qt修复。窃听器似乎是2-3个月前报告的。
  2. ( Gstreamer有无障碍/无缝视频支持)您肯定可以在用Qt开发的UI中嵌入一个媒体播放器。有示例
  3. 移动另一个UI库,它提供了更好的媒体播放功能。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33472761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档