需求:在调用其它音视频SDK的时候,在windows上一般会传入一个 winId 控件来显示视频,这个winID在Qt中一般是QWidget。目前想在这个视频上 显示一些提示信息,比如视频源的名字。

一,曾尝试过的几种方案

在视频源上写入:

(1),利用opencv ,将原始yuv数据 转成mat,然后利用opencv的内置函数,绘制文字。不过这样的缺点是,引入了第三方库并且耗费大量cpu资源。

(2),利用opengl 在渲染yuv数据时,绘制文字。经测试,利用openg进行渲染,可直接利用QWidget cpu利用率一样,可能是自己写错了,所以此方案也放弃。

在显示端写入:

(1),利用qml控件,叠加item窗体。qml本身也用了opengl渲染,效果和上述方案2一样,opengl 玩不明白。

(2),利用QWidget 控件叠加,至于上层,背景透明。简单方便 缺点是如果利用采集卡复制视频流,然后利用第三方软件播放,则名字就看不见了,因为数据源本身不含有名字信息。

二,代码

#ifndef VWIDGET_H
#define VWIDGET_H
#include <QWidget>
#include <QPainter>
class QLabel;class NameWidget:public QWidget{Q_OBJECT
public:NameWidget(QWidget*parent =nullptr);void setName(const QString &name);protected:void paintEvent(QPaintEvent *);private:QColor m_color;QLabel *m_label;};class VideoWidget : public QWidget
{Q_OBJECT
public:VideoWidget(QWidget*paren=nullptr);virtual ~VideoWidget() {}QWidget* video(){return m_videoWidget;}void setMicCameraStatus(bool _mic,bool _cam);void setName(const QString &name);void setIsMaster(bool isMaster);void setShowNameLabel(bool show);private:QLabel* m_mediaStatsLabel;//麦克风和 摄像机状态QWidget* m_videoWidget;NameWidget *m_nameWidget;bool m_isMaster;bool m_isShowName;
protected:void resizeEvent(QResizeEvent *);};#endif // VWIDGET_H
#include "videowidget.h"
#include <QLabel>
#include <QGridLayout>
#include <qDebug>
NameWidget::NameWidget(QWidget *parent):QWidget (parent)
{m_color = QColor(100,100,100,100);m_label = new QLabel(this);QFont ft;ft.setPointSize(35);m_label->setFont(ft);QString styleSheet = QString::fromUtf8("color: rgb(255, 255, 255);");m_label->setStyleSheet(styleSheet);m_label->setText(QString::fromUtf8("显示自己"));QGridLayout *layout = new QGridLayout(this);layout->setContentsMargins(9,0,0,0);layout->addWidget(m_label);this->setLayout(layout);
}void NameWidget::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.fillRect(this->rect(),m_color);
}void NameWidget::setName(const QString &name)
{m_label->setText(name);
}VideoWidget::VideoWidget(QWidget*paren):QWidget (paren),m_isMaster(false),m_isShowName(false){m_mediaStatsLabel = new QLabel(this);this->setAttribute(Qt::WA_TranslucentBackground);QString styleSheet = QString::fromUtf8("color: rgb(255, 255, 255);\n""background-color: rgb(0, 0, 0,100);");m_mediaStatsLabel->setStyleSheet(styleSheet);QFont ft;ft.setPointSize(10);m_mediaStatsLabel->setFont(ft);m_mediaStatsLabel->raise();setMicCameraStatus(true,true);m_mediaStatsLabel->hide();m_videoWidget = new QWidget(this);QGridLayout* layout = new QGridLayout(this);layout->setContentsMargins(0,0,0,0);layout->addWidget(m_videoWidget);this->setLayout(layout);m_videoWidget->lower();//m_nameWidget = new NameWidget(this);m_nameWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog|Qt::WindowStaysOnTopHint|Qt::SubWindow);m_nameWidget->setAttribute(Qt::WA_TranslucentBackground, true);QPalette pal;pal.setColor(QPalette::Background,QColor(90,90,90,90));m_nameWidget->setAutoFillBackground(true);m_nameWidget->setPalette(pal);m_nameWidget->hide();setAttribute(Qt::WA_TransparentForMouseEvents, true);
}void VideoWidget::setMicCameraStatus(bool _mic, bool _cam)
{QString mic;QString cam;if(_mic)mic="  Mic:ON";else {mic="  Mic:OFF";}if(_cam)cam=" Cam:ON";else {cam=" Cam:OFF";}m_mediaStatsLabel->setText(cam+mic);
}void VideoWidget::setName(const QString &name)
{m_nameWidget->setName(name);
}void VideoWidget::setIsMaster(bool isMaster)
{m_isMaster = isMaster;
}void VideoWidget::setShowNameLabel(bool show)
{m_isShowName=show;
}void VideoWidget::resizeEvent(QResizeEvent *e)
{if(!m_isMaster)m_mediaStatsLabel->show();if(m_isShowName)m_nameWidget->show();else {m_nameWidget->hide();}m_mediaStatsLabel->setGeometry(this->width()-120,0,120,15);//状态信息m_nameWidget->setGeometry(this->x(),this->y()+this->height()-53,this->width()/3,50);return QWidget::resizeEvent(e);
}

关键代码:

setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog|Qt::WindowStaysOnTopHint|Qt::SubWindow);
    m_nameWidget->setAttribute(Qt::WA_TranslucentBackground, true);
    QPalette pal;
    pal.setColor(QPalette::Background,QColor(90,90,90,90));
    m_nameWidget->setAutoFillBackground(true);
    m_nameWidget->setPalette(pal);
    m_nameWidget->hide();

setAttribute(Qt::WA_TransparentForMouseEvents, true);

三,效果

Qt QWidget视频上叠加文字相关推荐

  1. 【FFmpeg】ffmpeg使用drawtext过滤器在视频上叠加文字

    1.测试命令 ffmpeg -i 640-480p.mp4 -t 10 -vf "drawtext=fontfile=FreeMono.ttf:fontsize=100:x=10:y=100 ...

  2. Qt 视频上叠加透明图片

    Qt 视频上叠加透明图片 最近公司需要一个上位机软件,主要是全屏显示视频,在视频上面叠加透明图片. 调试了很多种方法,效果都不如意,主要是因为Qt 窗口背景不能被覆盖,透明背景,又不能播放视频. 我调 ...

  3. 怎么在视频上叠加字幕和Logo--开题篇

    视频叠加字幕和图标(在某些地方也叫叠加OSD)在很多场合都很有用,比如电视台在直播的节目上叠加台标:美女主播在直播时在视频上加上自己喜爱的饰物或大头贴以增加娱乐的气氛:电影播放时在视频下方显示中英文字 ...

  4. 怎么去除视频上的文字?一篇教你:视频上的文字水印怎么去除

    原创视频更能够吸引人,但是毕竟热点有限,想要随时保持活跃度和吸引力就必须借助更多的视频素材来留住粉丝.但是很多视频素材是有水印.文字.LOGO或者一些图像的,那怎么去除视频上的文字呢?小编一篇简单文章 ...

  5. 伪原创视频需要怎么处理?怎么消除别人视频上的文字?

    伪原创视频需要怎么处理?怎么消除别人视频上的文字? 看见网上经常说自媒体,感到特别的好奇通过对自媒体的初步了解,对于我这个门外汉来讲,怎样才能做好自媒体呢,我想应该从这几步入手. 1.明确目标,要明白 ...

  6. 怎么在视频上叠加字幕和Logo--技术实现2

    上一篇博文介绍了渲染时叠加字幕的技术实现方法,而这一篇给大家讲解怎么用修改视频像素的方法叠加字幕和Logo.下面我把叠加字幕和Logo都统称为叠加OSD. 图像有分YUV和RGB格式,每个像素都有一个 ...

  7. Python+Opencv:在视频上叠加一个背景透明Logo

    前言:看电视节目时,电视台都会把打在视频上,大多数视频Logo背景都是固定不便的,但有些做得好的效果是,Logo背后的视频是随节目内容实时变化的.这到底怎么实现的呢? 经过实践,我也搞了一个Logo背 ...

  8. php画中画,视频画中画怎么用?怎样在视频上叠加视频,可设置画中画小视频形状及边缘羽化效果...

    今天真的是深圳入冬以来最冷的一天,5~12°,尽管一大早翻箱倒柜找厚衣服披上,出门还是在冷风中瑟瑟发抖啊,看了天气预报这样寒冷的天气还要持续一段时间,看来羽绒服是时候派上用场了.好啦,继续给大家分享视 ...

  9. java图片叠加_[原创]JAVA中图片上叠加文字的方法

    --sunfruit JDK:1.3.x以上 功能:下面是一个简单在图片上面叠加文字的方法,有朋友如果有这方面的问题,就起个了解的作用 代码如下: import java.io.IOException ...

  10. 关于qt 实现laber上面的文字滚动

    写代码前.首先我们肯定要新建一个项目. 1.点击文件新建文件或项目 2.选择带界面的.名称自己写.然后继承widget.完成 3.这样,我们就得到了一个空的gui项目了. 新建一个能实现文字滚动的头. ...

最新文章

  1. 一步一步教您打印出自己大脑的3D模型
  2. R语言学习笔记-机器学习1-3章
  3. arcgis双标准纬线等角圆锥投影_世界地图是怎么制作出来的,各投影算法的来历...
  4. 95-180-055-源码-Watermark-AutoMaticWatermarkContext
  5. Nginx-1.18.0主函数main思维导图(第一版)
  6. 吴恩达机器学习 4.逻辑回归(Logistic Regression)
  7. python函数参数的作用是_python函数参数的不同
  8. 美国女童子军正在学习电脑黑客技术!
  9. Python+OpenCV:Hough圆检测(Hough Circle Transform)
  10. CCF202012-4 食材运输(100分题解链接)
  11. 爬虫实战—模拟登陆oschina
  12. Android开发中gitignore文件模板添加
  13. 程序阻碍OD调试的方式1
  14. JAVA超市管理系统
  15. NeoKylin-Server使用docker部署跨主机redis集群
  16. CSS:使用媒体查询进行网页元素的缩放
  17. 1005打印任务取消不了 hp_1005打印任务取消不了 hp_解决hp1005打印机无法打印故障...
  18. 故障效果,制作抖音效果的幻影海报
  19. 麒麟 linux下安装显卡驱动,优麒麟 Linux x64 16.10
  20. 化繁为简,我用”知晓推送”开发微信小程序订阅消息

热门文章

  1. 基于java廉价房屋租赁管理系统
  2. RxAndroid结合Retrofit,看看谁才是最佳拍档!
  3. C#编写的通过汉字得到拼音和五笔码
  4. 几何分布期望,方差推导
  5. 逻辑数据库设计 - 可变属性(继承)
  6. CTC blank 理解
  7. html里怎么画斜线表头,excel里斜线表头怎么做
  8. 笔记本win10玩红警黑屏_外星人笔记本新手优化教程
  9. RFID 工作频率的分类
  10. 信息学奥赛一本通(1097:画矩形)