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

使用QT进行多媒体视频播放时,QMediaPlayer无法直接显示字幕。通过将字幕手动绘制到视频上,可以实现字幕显示。作者参照论坛上的方法实现了这一功能,将字幕文字调整至视频底部中央,并提供了后续读取SRT字幕文件的思路。代码中还需处理纯白色文字在白色背景上看不见的问题,可以通过添加阴影来解决。
摘要由CSDN通过智能技术生成

 

 

标签: # Qt  qt  多媒体  字幕  视频播放

在这里插入图片描述


    QVideoWidget *videoWidget = new QVideoWidget();
    QMediaPlayer *player = new QMediaPlayer();
    player->setMedia(QUrl::fromLocalFile("/Users/pikachu/Movies/《千与千寻》片段.mp4"));
    player->setVideoOutput(videoWidget);
    setCentralWidget(videoWidget);
    player->play();
    resize(1920, 1080);

但是 QMediaPlayer却没有办法播放字幕
一个做法是自己把字幕画上去
想法来源:https://forum.qt.io/topic/47378/again-how-show-a-subtitle-on-qmediaplayer
在这里插入图片描述
我根据这个想法,做了一个实现
在这里插入图片描述


    resize(1440, 720);
    auto videoItem = new QGraphicsVideoItem();
    auto srtTextItem = new QGraphicsTextItem();
    auto scene = new QGraphicsScene();
    auto view = new QGraphicsView(scene);
    scene->addItem(videoItem);
    scene->addItem(srtTextItem);
    srtTextItem->setPlainText("SRT TEXT");
    setCentralWidget(view);
    QMediaPlayer *player = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
    player->setMedia(QUrl::fromLocalFile("/Users/pikachu/Movies/《千与千寻》片段.mp4"));
    player->setVideoOutput(videoItem);
    player->play();
    view->show();
    videoItem->setSize(size());

这样就能显示文字了,最后就是把文字显示在视频的底部中间部分
调一下字的位置
在这里插入图片描述


    auto textRectSize = srtTextItem->boundingRect().size();
    auto target_y = videoItem->size().height() - textRectSize.height();
    auto target_x = (videoItem->size().width() - textRectSize.width()) / 2;
    srtTextItem->setPos(target_x, target_y);

字幕一般是白色,且比目前我的这个稍微大一点

在这里插入图片描述


    srtTextItem->setDefaultTextColor(QColorConstants::White);
    auto font = srtTextItem->font();
    font.setPixelSize(26);
    srtTextItem->setFont(font);
  • 1
  • 2
  • 3
  • 4
  • 5

这样就达到我的预期了。
后面就是如何读取SRT字幕文件,并根据时间显示不同的字幕文字。
这里就不写了,剩下的部分,在我写的一个稍微大的项目里整合了在一起。

所有代码

// 头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};
#endif // MAINWINDOW_H

// 源文件
#include "mainwindow.h"
#include <QtWidgets>
#include <QVideoWidget>
#include <QtMultimedia>
#include <QGraphicsVideoItem>
#include <QGraphicsTextItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(1440, 720);
    auto videoItem = new QGraphicsVideoItem();
    auto srtTextItem = new QGraphicsTextItem();
    auto scene = new QGraphicsScene();
    auto view = new QGraphicsView(scene);
    scene->addItem(videoItem);
    scene->addItem(srtTextItem);
    srtTextItem->setPlainText("SRT TEXT");
    setCentralWidget(view);
    QMediaPlayer *player = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
    player->setMedia(QUrl::fromLocalFile("/Users/pikachu/Movies/《千与千寻》片段.mp4"));
    player->setVideoOutput(videoItem);
    player->play();
    view->show();
    videoItem->setSize(size());
    srtTextItem->setDefaultTextColor(QColorConstants::White);
    auto font = srtTextItem->font();
    font.setPixelSize(26);
    
    srtTextItem->setFont(font);
    auto textRectSize = srtTextItem->boundingRect().size();
    auto target_y = videoItem->size().height() - textRectSize.height();
    auto target_x = (videoItem->size().width() - textRectSize.width()) / 2;
    srtTextItem->setPos(target_x, target_y);
}

MainWindow::~MainWindow()
{
}


  •  

补充:
如果只用纯白色的文字,在白色的背景下就看不见,所以要加一个阴影。
代码如下


    QGraphicsDropShadowEffect *e2 = new QGraphicsDropShadowEffect(this);
    e2->setOffset(1,1);
    srtTextItem->setGraphicsEffect(e2);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值