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

举报
风吹稻花香 发表于 2021/06/05 00:09:35 2021/06/05
【摘要】     标签: # Qt  qt  多媒体  字幕  视频播放 QVideoWidget *videoWidget = new QVideoWidget(); QMediaPlayer *player = new QMediaPlayer(); play...

 

 

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

在这里插入图片描述


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

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


  
  1. resize(1440, 720);
  2. auto videoItem = new QGraphicsVideoItem();
  3. auto srtTextItem = new QGraphicsTextItem();
  4. auto scene = new QGraphicsScene();
  5. auto view = new QGraphicsView(scene);
  6. scene->addItem(videoItem);
  7. scene->addItem(srtTextItem);
  8. srtTextItem->setPlainText("SRT TEXT");
  9. setCentralWidget(view);
  10. QMediaPlayer *player = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
  11. player->setMedia(QUrl::fromLocalFile("/Users/pikachu/Movies/《千与千寻》片段.mp4"));
  12. player->setVideoOutput(videoItem);
  13. player->play();
  14. view->show();
  15. videoItem->setSize(size());

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


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

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

在这里插入图片描述


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

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

所有代码


  
  1. // 头文件
  2. #ifndef MAINWINDOW_H
  3. #define MAINWINDOW_H
  4. #include <QMainWindow>
  5. class MainWindow : public QMainWindow
  6. {
  7. Q_OBJECT
  8. public:
  9. MainWindow(QWidget *parent = nullptr);
  10. ~MainWindow();
  11. };
  12. #endif // MAINWINDOW_H
  13. // 源文件
  14. #include "mainwindow.h"
  15. #include <QtWidgets>
  16. #include <QVideoWidget>
  17. #include <QtMultimedia>
  18. #include <QGraphicsVideoItem>
  19. #include <QGraphicsTextItem>
  20. #include <QGraphicsScene>
  21. #include <QGraphicsView>
  22. #include <QDebug>
  23. MainWindow::MainWindow(QWidget *parent)
  24. : QMainWindow(parent)
  25. {
  26. resize(1440, 720);
  27. auto videoItem = new QGraphicsVideoItem();
  28. auto srtTextItem = new QGraphicsTextItem();
  29. auto scene = new QGraphicsScene();
  30. auto view = new QGraphicsView(scene);
  31. scene->addItem(videoItem);
  32. scene->addItem(srtTextItem);
  33. srtTextItem->setPlainText("SRT TEXT");
  34. setCentralWidget(view);
  35. QMediaPlayer *player = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
  36. player->setMedia(QUrl::fromLocalFile("/Users/pikachu/Movies/《千与千寻》片段.mp4"));
  37. player->setVideoOutput(videoItem);
  38. player->play();
  39. view->show();
  40. videoItem->setSize(size());
  41. srtTextItem->setDefaultTextColor(QColorConstants::White);
  42. auto font = srtTextItem->font();
  43. font.setPixelSize(26);
  44. srtTextItem->setFont(font);
  45. auto textRectSize = srtTextItem->boundingRect().size();
  46. auto target_y = videoItem->size().height() - textRectSize.height();
  47. auto target_x = (videoItem->size().width() - textRectSize.width()) / 2;
  48. srtTextItem->setPos(target_x, target_y);
  49. }
  50. MainWindow::~MainWindow()
  51. {
  52. }
  •  

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


  
  1. QGraphicsDropShadowEffect *e2 = new QGraphicsDropShadowEffect(this);
  2. e2->setOffset(1,1);
  3. srtTextItem->setGraphicsEffect(e2);

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/116700447

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。