当前位置: 首页 > news >正文

QT播放视频保持视频宽高比消除黑边

QT播放视频保持视频宽高比消除黑边

1、问题

在播放视频的时候,由于框架的大小发生变化,导致视频出现黑边很不好看。
因此需要像一种方法消除黑边

2、处理

1、读取视频的宽高比
2、设置视频的Widget的大小固定,Widget的宽高比和视频宽高比相同。

  • cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QMediaMetaData>

void MainWindow::playVideo()
{
    player->play();
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    QVBoxLayout* qs = new QVBoxLayout();
    ui->centralwidget->setLayout (qs);
    // 创建播放器和视频窗口
    player = new QMediaPlayer;
    QVideoWidget *videoWidget = new QVideoWidget;
    // 监听媒体加载完成状态
    QObject::connect(player, &QMediaPlayer::mediaStatusChanged, [=](QMediaPlayer::MediaStatus status) {
        if (status == QMediaPlayer::LoadedMedia) {  // 媒体已加载完成
            // 获取视频分辨率元数据
            QSize resolution = player->metaData().value(QMediaMetaData::Resolution).toSize();
            if (!resolution.isEmpty()) {
                qDebug() << "视频宽高:" << resolution;
            } else {
                qDebug() << "未获取到分辨率信息";
            }
            int w = resolution.width ();
            int h = resolution.height ();
            double r = 1.0 * w / h;
            int ww = 800;
            int hh = int(ww / r);
            qDebug() << ww << " " << hh << " s " << w << " " << h;
            // 固定宽高比
            videoWidget->setFixedSize (QSize(ww, hh));
        }
    });
    // 强制拉伸填充窗口(可能变形)
    videoWidget->setAspectRatioMode(Qt::IgnoreAspectRatio);
    // 隐藏黑边(设置背景色透明)
    videoWidget->setStyleSheet("background-color: transparent;");
    player->setVideoOutput(videoWidget);
    videoWidget->show();

    // 加载视频文件(支持 MP4、AVI 等常见格式)
    player->setSource (QUrl::fromLocalFile("/Users/xiaolixi/Desktop/录屏2025-03-01 11.03.06.mov"));
    
    // 设置循环播放
    player->setLoops (-1);
    QPushButton* start = new QPushButton("start");
    // 设置视频水平居中
    qs->addWidget (videoWidget, 0, Qt::AlignHCenter); // 关键:对齐方式
    qs->addWidget (start);
    QObject::connect(start, SIGNAL(pressed()), this,  SLOT(playVideo()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
  • h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void playVideo();

private:
    Ui::MainWindow *ui;
    QMediaPlayer *player;
};
#endif // MAINWINDOW_H

  • pro文件
QT       += core gui
QT +=   multimediawidgets
QT +=   multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

在这里插入图片描述

缺点

视频大小固定了。但是在我的场景中这个确定不影响。

相关文章:

  • 基于javaweb的SSM+Maven幼儿园管理系统设计和实现(源码+文档+部署讲解)
  • brew search报错,xcrun:error:invalid active developer path CommandLineTools
  • 通俗易懂的分类算法之决策树详解
  • 使用Simulink中的IsUpdated获取Rport的更新状态
  • 当我删除word文件时无法删除,提示:操作无法完成,因为已在Microsoft Word中打开
  • 一、舵机模块的分析与使用
  • flowable使用
  • 问题修复-后端返给前端的时间展示错误
  • 7.1 - 定时器之中断控制LED实验
  • SpringBoot原理-02.自动配置-概述
  • 微服务即时通信系统---(七)文件管理子服务
  • 飞书考勤Excel导入到自己系统
  • 网络原理--TCP/IP(2)
  • 神经网络|(十一)|神经元和神经网络。
  • 深入了解 K-Means 聚类算法:原理与应用
  • C++22——哈希(上)
  • GD32F303 系统时钟
  • 例子 DQN + CartPole: 深入思考一下,强化学习确实是一场智能冒险之旅!
  • 《今日AI-人工智能-编程日报》
  • 深入解析 Svelte:下一代前端框架的革命
  • 便民网站开发/百度竞价冷门产品
  • 上海网站建设 乐云seo/网站数据分析
  • 陕西煤业化工建设集团网站/网络营销服务的特点
  • 用jsp做网站一般会用到什么软件/seo官网优化怎么做
  • 域名查ip地址查询/西安seo主管
  • 坪山商城网站建设哪家公司靠谱/南京关键词优化服务