视频播放

news2025/7/18 11:54:40
  • QMediaPlayer不仅可以播放音频,还可以播放视频,不过要在屏幕上显示的话需要使用QVideoWidget和QGraphicsVideoItrm或自定义的类。
  • QMovie 播放GIF文件
  • QVideoWidget和QGraphicsVideoItrm都属于QMulimedia Widgets模块
  • QVideoWidget 继承自QWiaget,可以作为普通窗口显示,也可以嵌入其他窗口

QVideoWidgat 

QVideoWidget 类提供了一个小部件,用于呈现由媒体对象生成的视频。

常用的函数:

setAspectRatioMode()设置宽高比
setBrightness()设置亮度(-100,100)默认为0
setContrast()设置对比度(-100,100)默认为0
setFullScreen(bool fullScreen)设置全屏
setHue(int hue)设置色调(-100,100)默认为0
setSaturation(intsaturation)设置饱和度(-100,100)默认为0

在pro文件中修改:

把:QT   +=core gui

修改为:QT += core gui multimedia multimediawidgets

在widget.h中添加类的前置声明:

class QMediaPlayer;
class QVideoWidget;

再添加两个私有对象:

    QMediaPlayer *player;
    QVideoWidget *video;

 在ui界面中添加以下控件:

把widget的大小改为600×600

把左边4个滑块在ui界面的属性框中修改为-100-100

音量滑块为:0-100

倍数滑块为:1-3

 widget.cpp中实现:

添加两个头文件:

#include<QMediaPlayer>
#include<QVideoWidget>

构造函数中实现:

    player=new QMediaPlayer(this);
    video=new QVideoWidget(this);
    video->resize(400,300);//设置播放器大小
    video->move(0,0);
    player->setVideoOutput(video);//设置播放器
    player->setMedia(QUrl::fromLocalFile("F:\\video\\bd.mkv"));//设置播放对象
    connect(ui->pushButton,&QPushButton::clicked,[=]()
    {
        player->play();//点击开始按钮,播放视频
    });
    connect(ui->pushButton_2,&QPushButton::clicked,[=]()
    {
        player->pause();//点击暂停按钮,暂停视频
    });

    //亮度的设置
    ui->horizontalSlider->setValue(video->brightness());//设置初始亮度
    //当滑块移动,亮度也跟着移动
    connect(ui->horizontalSlider,&QSlider::sliderMoved,video,&QVideoWidget::setBrightness);
    //当亮度改变,滑块也跟着移动
    connect(video,&QVideoWidget::brightnessChanged,ui->horizontalSlider,&QSlider::setValue);

    //对比度的设置
    ui->horizontalSlider_2->setValue(video->saturation());//设置初始对比度
    connect(ui->horizontalSlider_2,&QSlider::sliderMoved,video,&QVideoWidget::setContrast);
    connect(video,&QVideoWidget::contrastChanged,ui->horizontalSlider_2,&QSlider::setValue);

    //饱和度的设置
    ui->horizontalSlider_3->setValue(video->contrast());//设置初始对比度
    connect(ui->horizontalSlider_3,&QSlider::sliderMoved,video,&QVideoWidget::setSaturation);
    connect(video,&QVideoWidget::saturationChanged,ui->horizontalSlider_3,&QSlider::setValue);

    //色相的设置
    ui->horizontalSlider_4->setValue(video->hue());//设置初始对比度
    connect(ui->horizontalSlider_4,&QSlider::sliderMoved,video,&QVideoWidget::setHue);
    connect(video,&QVideoWidget::hueChanged,ui->horizontalSlider_4,&QSlider::setValue);

    //音量的设置
    ui->horizontalSlider_5->setValue(player->volume());//设置初始音量
    connect(ui->horizontalSlider_5,&QSlider::sliderMoved,player,&QMediaPlayer::setVolume);
    connect(player,&QMediaPlayer::volumeChanged,ui->horizontalSlider_5,&QSlider::setValue);

    //倍速的设置
    ui->horizontalSlider_6->setValue(player->playbackRate());//设置初始音量
    connect(ui->horizontalSlider_6,&QSlider::sliderMoved,player,&QMediaPlayer::setPlaybackRate);
    connect(player,&QMediaPlayer::playbackRateChanged,ui->horizontalSlider_6,&QSlider::setValue);

运行时可能会出现的错误:

DirectShowPlayerService::doRender: Unresolved error code 0x80040266

能运行但视频无法播放

点击下面的链接,安装一个解码器。

 Qt中的多媒体播放,底层是使用DirectShowPlayerService,所以安装一个DirectShow解码器-QT文档类资源-CSDN文库

QGraphicsVideoItem

继承自QGraphicsObject,QGraphicsVideoItem提供一个窗口,并作为一个图形项嵌入到场景中显示视频。

用法:

在pro文件中修改:

把:QT   +=core gui

修改为:QT += core gui multimedia multimediawidgets

 在main.cpp中添加以下代码

#include "widget.h"

#include <QApplication>
#include<QMediaPlayer>
#include<QGraphicsVideoItem>
#include<QGraphicsView>
#include<QGraphicsScene>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;//QGraphicsView的容器
    QGraphicsView view(&scene);//创建可视化场景
    view.resize(600,600);//设置该场景大小
    QGraphicsVideoItem item;//创建一个视频显示器
    scene.addItem(&item);
    item.setSize(QSize(400,400));//设置显示大小
    QMediaPlayer player;
    player.setVideoOutput(&item);//添加显示器
    player.setMedia(QUrl::fromLocalFile("F:/video/bd.mkv"));//设置播放视频
    player.play();
    view.show();
    //Widget w;
    //w.show();
    return a.exec();
}

 QMovie

此类用于显示没有声音的简单动画

构造函数:

常用的函数:

setfFileName()设置播放文件
setBackgroundColor()设置背景颜色
setDevice()设置设备
setFromat()设置解码时的格式
state()返回当前状态
setCacheMode()设置缓存模式
start()播放
stop()停止
setSpeed()设置播放速度
setPaused(bool)true为暂停  false为开始
jumpToFrame()跳转到帧号
frameCount()返回帧数
currentPixmap()返回当前页面
currentImage()以QImage的形式返回页面

 QMovie::setCacheMode()(缓存模式)

QMovie::CacheNone不缓存任何帧(默认值)
QMovie::CacheAll缓存所有帧

实现一个动画:

在widget.h中添加一个QMovie对象

    QMovie *movie;

在ui界面中添加以下控件:

一个label 把边框设为Box

一个水平滑块

四个pushButton

 构造函数中添加:

    ui->label->setAlignment(Qt::AlignCenter);//设置为中心
    ui->label->setBackgroundRole(QPalette::Dark);//设置填充背景
    ui->label->setAutoFillBackground(true);
    movie=new QMovie(this);
    movie->setFileName("E:/图片/132eb06b80694d55a1367bd74a78b154.gif");
    movie->setCacheMode(QMovie::CacheAll);//设置缓存模式
    movie->setScaledSize(ui->label->size());//调整大小
    ui->label->setMovie(movie);//添加动画
    ui->horizontalSlider->setMinimum(0);//设置最小为0
    ui->horizontalSlider->setMaximum(movie->frameCount());//设置最大
    //滑块跟着动画移动
    connect(movie,&QMovie::frameChanged,ui->horizontalSlider,&QSlider::setValue);
    //滑块移动动画跟着移动
    connect(ui->horizontalSlider,&QSlider::valueChanged,movie,&QMovie::jumpToFrame);
    //点击开始按钮,开始播放
    connect(ui->pushButton,&QPushButton::clicked,movie,&QMovie::start);
    //点击暂停按钮,暂停播放
    connect(ui->pushButton_2,&QPushButton::clicked,[=]()
    {
        movie->setPaused(true);
    });
    //点击停止按钮,重置并停止
    connect(ui->pushButton_3,&QPushButton::clicked,movie,&QMovie::stop);
    //实现截图当前画面
    connect(ui->pushButton_4,&QPushButton::clicked,[=]()
    {
        int id=movie->currentFrameNumber();
        QPixmap pix=movie->currentPixmap();//获取当前的画面
        pix.save(QString("D:/%1.png").arg(id));//设置文件编号
    });

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio下载安装

一、下载 二、安装步骤 点击下载的安装包&#xff0c;选择地址的时候可以自定义&#xff0c;其他按照默认配置即可。 启动应用&#xff0c;开始配置 选择安装类型为标准安装&#xff1a; 选择主题 确认配置 同意协议 开始下载相关组件&#xff1a; 下载完成

SpringCloud - GateWay服务网关

文章目录一. Gateway概述1.Gateway是什么2. Gateway作用3. 微服务架构中网关的位置4. SpringCloud Gateway概念5. SpringCloud Gateway IO 模型二.Gateway的三大核心概念1. Route 路由2. Predicate 断言3. Filter 过滤4. 总结三.Spring Cloud Gateway工作流程四.服务搭建1. 创建…

Android 基础知识3-3(九妹)图怎么用呢?

1.本节引用&#xff1a; 可能有的一些疑问&#xff1a; 1.什么是.9图片&#xff1f; 答&#xff1a;图片后缀名前有.9的图片,如pic1.9.png这样的图片 2. .9图片能干嘛&#xff1f; 答&#xff1a; 在图片拉伸的时候特定的区域不会发生图片失真&#xff0c;而不失真的区域可以…

知识库指南4.0|AIGC Web3 元宇宙发展趋势的学习与实践指引

如何突破信息层面的认知&#xff0c;在 AIGC、Web3 与 元宇宙领域从 “围观” “看热闹” 到真正入门理解&#xff0c;并跟紧行业发展趋势&#xff0c;探索实践落地&#xff1f;&#xff08;阅读原文领取限量优惠券&#xff09;Mixlab小杜满足上述学习需求的知识库需要包含四要…

大数据(9f)Flink双流JOIN

文章目录概述开发环境使用状态列表实现 INNER JOIN&#xff08;双流connect后CoProcessFunction&#xff09;基于间隔的JOIN&#xff08;Interval Join&#xff09;基于窗口的JOIN&#xff08;Window Join&#xff09;概述 Flink双流JOIN可用算子或SQL实现&#xff0c;FlinkSQ…

图论基础学习笔记

图论1.简单图2.简单图的补图3.图的同构4.完全图5.偶图6.完全偶图1.简单图 简单图&#xff1a;无环无平行边的图。下图&#xff1a;左环右平行边 平凡图&#xff1a;G(1,0)G(1,0)G(1,0) 零图&#xff1a;G(p,0)G(p,0)G(p,0) 2.简单图的补图 补图&#xff1a;对于 G(V,E)G(V,…

继电器电路分析-继电器放电时间、反向冲击电压

继电器的应用&#xff0c;相信大家都知道&#xff0c;在电路中只要给它供电、断电也就可以工作了。 然而&#xff0c;它的应用细节&#xff0c;不知道大家有没注意 。下面谈谈我的观点。 01 现在流行的接法 如下图&#xff1a; 图中&#xff0c;继电器的线圈经过Q1作为开关…

《丞相好梦中杀人,我喜梦中听课》(1)密码学入门

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1fad2;每日emo&#xff1a;等我把脸皮磨厚 &#x1f342;专栏地址&#xff1a;网安专栏 今天周日&#xf…

金融开放度指数-世界银行三位数字编码、ISO Alpha-3 Code等多指标数据

1、数据来源&#xff1a;http://web.pdx.edu/~ito/Chinn-Ito_website.htm 2、时间跨度&#xff1a;1970-2019 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; Chinn-Ito指数(KAOPEN)是衡量一个国家资本账户开放程度的指标。 该指数最初是在Chinn和Ito (Journal of D…

并发基础(四):线程池

尺有所短&#xff0c;寸有所长&#xff1b;不忘初心&#xff0c;方得始终。 请关注公众号&#xff1a;星河之码 线程池技术是一种多线程处理形式&#xff0c;将任务添加到队列中&#xff0c;通过线程池中创建出来的现成执行这些任务&#xff0c;省去了创建线程和销毁线程的消耗…

let const var区别

文章目录写在前面1.var关键字1.1 没有块级作用域的概念&#xff0c;有全局作用域、函数作用域的概念1.2 存在变量提升1.3 全局作用域用var声明的变量会挂载到window对象上1.4 同一作用域中允许重复声明1.5 不初始化值默认为undefined2.let关键字2.1 有块级作用域的概念2.2 不存…

HTB靶机:RainyDay

目录介绍主机信息探测网站探测子域名爆破(BurpSuite)目录爆破爆破参数值分析 & 破解hash登录系统反弹shell端口转发内网穿透【很坑】配置socks代理内网扫描换用windows做内网渗透子域名信息收集爆破密钥位置爆破密钥内容JWT攻击进程监控Flag1 & 获取SSH私钥提权python沙…

UE4 通过按键切换不同的HUD

咱们在玩游戏的时候&#xff0c;通常会和界面进行各种各样的互动&#xff0c;而且会动都是在不同的界面上&#xff0c;所以需要在不同的界面上进行切换或者多个HUD重叠显示在一起。 首先创建两个HUD 2.重新定义一个PlayerController类 // Fill out your copyright notice…

被裁后半月面试8家公司无果,凭借这份Java面试指南成功入职阿里

前言 上个月班上的好好的突然被通知"毕业了"&#xff0c;现在工作也确实不好找。之前近一个月面了很多大大小小的公司降薪太严重都没考虑去&#xff0c;最后没办法本来都打算随便去一家了却偶然得到一个阿里的面试机会&#xff0c;足足面了七面&#xff08;我太难了…

前有刘德华,后有腾格尔和光头李进,明星为何都热衷于线上演唱会

2022年11月19日&#xff0c;有着“草原歌神”之称的腾格尔&#xff0c;开启了自己的线上演唱会&#xff0c;并且取得了圆满的成功。其实在此之前&#xff0c;天王刘德华已经在某音平台&#xff0c;两次开启自己的线上演唱会&#xff0c;都受到了非常好的效果。 为什么音乐领域的…

手把手教你定位线上MySQL锁超时问题,包教包会

昨晚我正在床上睡得着着的&#xff0c;突然来了一条短信。 ​什么&#xff1f;线上的订单无法取消&#xff01; 我赶紧登录线上系统&#xff0c;查看业务日志。 ​发现有MySQL锁超时的错误日志。 不用想&#xff0c;肯定有另一个事务正在修改这条订单&#xff0c;持有这条订单的…

【边缘注意:深度多尺度特征】

Learning a Deep Multi-Scale Feature Ensemble and an Edge-Attention Guidance for Image Fusion &#xff08;学习深度多尺度特征集成和图像融合的边缘注意指南&#xff09; 在本文中&#xff0c;我们提出了一种用于红外和可见光图像融合的深度网络&#xff0c;该网络将具…

带你了解什么是Java虚拟机运行时数据区

一、前言 程序都是运行在内存里的&#xff0c;所以对于一门开发语言来说&#xff0c;对于内存的管理都是重中之重的&#xff0c;前有C、C需要开发者管理内存&#xff0c;后有Java的自动内存管理&#xff0c;到如今的内存安全的Rust。 二、运行时数据区概览 Java虚拟机在运行…

PyQt5可视化编程-菜单和工具栏

一、简介 PyQt5 是Digia的一套Qt5与python绑定的应用框架&#xff0c;同时支持2.x和3.x。本教程使用的是3.x。Qt库由Riverbank Computing开发&#xff0c; 是最强大的GUI库之一 &#xff0c;官方网站&#xff1a;www.riverbankcomputing.co.uk/news。 PyQt5是由一系列Python模块…

Allegro上如何让飞线以方框形式显示

Allegro上如何让飞线以方框形式显示 Allegro可以让飞线以方框形式显示,让走线评估更简单,尤其是电源和地,如下图 选择Edit-Property Find选择Nets 选择需要改成方框显示的网络,左边选择Voltage,Value里面输入任意一个数字,比如0或者1,apply 可以看到网络已经显示成…