• Qt如何实现动态背景-视频背景


    前言

    需求:加载视频作为视频背景,在上层可以进行图片的动画化,或是进行其他操作。

    几种方法:

    1、直接将视频弄成一个QDialog, 然后再上层在弄一个QDialog,背景透明即可。但遇到一个问题,QDialog没办法局部透明。

    2、使用QOpenGLWidget: 这个方案没有使用。

    3、使用QGraphicsVideoItem:当前使用的是这个方案,但这个方案有缺陷,有可能不支持某些mp4文件。所以,会导致显示不成功。这个问题已经基本解决了,只要把对应的Mp4文件转变成AVC(H264)格式就可以了。

    正文

    一、QVideoWidget + QMediaPlayer

    1、成功运行的代码

    ui->setupUi(this);
    setWindowFlags(windowFlags() | Qt::FramelessWindowHint);//无边框
    
    player = new QMediaPlayer;
    videoWidget = new QVideoWidget();
    player->setVideoOutput(videoWidget);
    player->setMedia(QUrl::fromLocalFile("./product/video/test1.mp4"));
    
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(videoWidget);
    ui->wgtVideo->setLayout(layout);
    videoWidget->show();
    player->play();
    show();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行成功的图片:

    2、工程代码

    二、QGraphicsVideoItem + QMediaPlayer

    1、成功运行的代码

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QGraphicsScene scene;
        QGraphicsView view(&scene);
        view.resize(1280, 720);
        QGraphicsVideoItem item;
        scene.addItem(&item);
        item.setSize(QSizeF(1280, 720));
        item.setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
        QMediaPlayer player;
        player.setVideoOutput(&item);
        player.setNotifyInterval(2000);//设置信息更新周期为2000ms
        player.setMedia(QUrl::fromLocalFile("./product/video/test2.mkv"));
        player.play();
        view.show();
    
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    效果:

    在这里插入图片描述

    2、遇到的问题

    1、DirectShowPlayerService::doRender: Unknown error 0x80040200.

    由于QGraphicsVideoItem支持的视频格式是有限的,所以有可能是不支持mp4文件的,转换成mkv文件就成功了。后面我又换了一个mp4文件,就没啥问题了,所以是我之前的那个测试的mp4文件时有问题的,我的测试视频是从这里下载的: https://sample-videos.com/index.php#sample-mp4-video

    还有可能是驱动没装:QMediaPlayer的驱动:

    链接:https://pan.baidu.com/s/13aEhts8ipAYv6TD2WFIo7Q
    提取码:1111

    还有可能是LAV Filter: https://blog.csdn.net/weixin_45827203/article/details/105220756

    以下是错误的可能性:

    1. 视频格式:QGraphicsVideoItem 只支持某些视频格式。请确保您的视频格式是支持的。通常情况下,支持 H.264 和 MPEG-4 等常见格式。
    2. 文件路径:请确保您提供给 QGraphicsVideoItem 的视频文件路径是正确的。如果视频文件不存在或路径不正确,它将无法播放。
    3. 缺少解码器:如果您的系统上缺少适当的解码器,QGraphicsVideoItem 将无法正常播放视频。您可以尝试在您的系统上安装适当的解码器以解决此问题。
    4. 硬件加速:通常,硬件加速会加速视频播放,并减少 CPU 使用率。但有时启用硬件加速可能导致播放问题。如果您启用了硬件加速,请尝试禁用它,并查看视频是否可以成功播放。
    5. 版本兼容性:QGraphicsVideoItem 可能与某些特定版本的 Qt 或操作系统版本不兼容。请确保您使用的 Qt 版本是最新的,并且与您的操作系统兼容。另外,请确保您的操作系统已经安装了必要的更新和修补程序。
    6. 其他问题:如果视频仍然无法播放,请检查是否存在其他问题,比如媒体库文件损坏或者与播放器相关的问题。在这种情况下,您可以尝试使用其他的媒体库或播放器来测试您的视频文件。

    2、DirectShowPlayerService::doRender: Unknown error 0x80040218.

    出现这个问题,代表的是没有对应的解码器对其进行解码。

    首先,你应该确保,你安装了:K-Lite_Codec_Pack_1785_Standard 下载链接是这个:http://www.codecguide.com/

    直接下载最新的即可。

    >

    然后,如果还是不行的话,就只能将你要显示的视频进行格式转换了,需要转换成AVC(H264)

    在这里插入图片描述

    可以使用格式工厂进行转换,这个工具的下载链接在这里:

    链接:https://pan.baidu.com/s/14XRat5EM8OLZuT8zPb4usg
    提取码:1111

    3、工程代码

    QGraphicsVideoItem的工程测试代码

    运行环境:Qt Creator 7.0.2 MSVC2015 UTF8

    参考

    一、下载测试视频的网站

    1、https://www.motionplaces.com/paris/

    2、https://www.videvo.net/video/raindrops-in-super-slow-motion/3313/#rs=video-box

    3、4K、高清、无水印视频素材库,你要的素材来啦~

    1、测试视频下载网站

    二、解决该问题所遇到的比较有用的网站

    2、https://cloud.tencent.com/developer/ask/sof/106854758:因为Qt不允许透明背景的小部件在视频上呈现。背景显示为黑色,而不是实际的视频。

    3、Qt踩坑记001:无法在读取相机图像的取景器QVideoWidget/QGraphicsVideoItem上显示图片

    4、Qt疑难杂症:无法QVideoWidget播放器上浮控件-解释原因

    5、视频播放

    6、QT多媒体 播放视频并显示字幕

    7、使用Qt进行音视频播放

    8、可以免费对视频进行切割

  • 相关阅读:
    idea 新建文件模板
    黑客技术(网络安全)自学2024
    CC27 二叉树中的最大路径和
    有关动态规划的相关优化思想
    JavaWeb开发之——数据库设计(20)
    单元测试到底是什么?应该怎么做?
    Github操作—SSH免密登录(六)——Git
    洛谷 P3128 最大流Max Flow
    vivo全球商城全球化演进之路——多语言解决方案
    【JDBC实战】水果库存系统 [代码优化]
  • 原文地址:https://blog.csdn.net/qq_43211060/article/details/133774262