libVLC视频上层添加控件——Qt

前言

起初我是想在界面上画个图,贯穿在整个视频中,跟水印很类似。本想获取每一帧图片,然后在上面绘制,但是这个效率太慢了,得不偿失;后来,查了查资料,发现这件事情完全可由Qt 控件实现,不必每一帧绘制,使视觉上他们是个整体就可以。

最终,我的界面效果是:将功能按钮(比如 播放、停止按钮)等,排放到视频下方。

 

效果图

 

 

代码和说明

如果直接在显示视频的Widget上直接放置控件,如一个按钮,这样会直接黑屏如下图,添加的按钮都没了。这是因为我将这个界面都给libvlc显示视频了,即控制权在libvlc手中。

所以得想个办法不将功能控件交给libvlc管理:将功能控件设为窗体,他就独立了,然后再将背景设成透明,视觉上就一样了,完美解决了这个问题。

    //设置为窗口模式
    m_pControlWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::Window);

    //设置背景透明
    m_pControlWidget->setAttribute(Qt::WA_TranslucentBackground,true);

 

解决透明处不触发点击信号的问题

设置属性为 Qt::WA_TranslucentBackground,就会有个问题:若m_pControlWidget上的按钮背景图有部分透明的,那么透明处鼠标点击事件将穿过去,将不会触发按钮的点击信号,响应的事件将不会执行。

我解决这一问题,我想到两种方案:

将线型图标改为面型图标,如下图,将非透明区扩大,即扩大点击面积。

将按钮改成不全透明的,透明度改为0.1

QPushButton#stopButton{
	border-image: url(:/res/stop.png);
    border:none;
    background-color:rgba(0,0,0,0.1);
}

 

 使控制面板随界面事件而变化

这里监控了整个界面的事件,包括显示、隐藏等。

bool VideoWidget::event(QEvent *event)
{
    switch (event->type()) {
    case QEvent::Show:{
        showSubWindow();
        break;
    }
    case QEvent::WindowActivate:
    case QEvent::Resize:
    case QEvent::Move:{
        moveSubWindow();
        break;
    }
    case QEvent::Hide:{
        hideSubWindow();
        break;
    }
    default:
        break;
    }
    return QWidget::event(event);
}

void VideoWidget::showSubWindow()
{
    m_pControlWidget->show();
    QTimer::singleShot(50,this,&VideoWidget::moveSubWindow);
}

void VideoWidget::hideSubWindow()
{
    m_pControlWidget->hide();
}

void VideoWidget::moveSubWindow()
{
    int w=this->width();
    int h=this->height();

    m_pControlWidget->setFixedWidth(w);
    moveSubWindowByPoint(m_pControlWidget,QPoint(0,h-m_pControlWidget->height()));
}

void VideoWidget::moveSubWindowByPoint(QWidget* widget,QPoint pt)
{
    int w=width()-widget->width();
    int h=height()-widget->height();

    //大小合理时显示
    if(w>=0 && h>=0)
    {
        widget->setWindowOpacity(1);
        QPoint p=mapToGlobal(QPoint(0,0));
        int x=p.x()+pt.x();
        int y=p.y()+pt.y();
        widget->move(x,y);
        widget->raise();
    }else{
        widget->setWindowOpacity(0);
    }
}

 

结束语

后面有时间,我想给视频增加表情图,不知道能不能实现,等我好消息!

### 回答1: LibVLC是一个跨平台的开源多媒体框架,可用于创建各种类型的媒体应用程序。Qt是一个流行的跨平台应用程序框架,提供了一系列强大的工具和库来构建全功能应用程序。RTSP是一种常用的流媒体传输协议,用于在IP网络上进行音频和视频的传输。 LibVLC可以被集成到Qt应用程序中,用于播放RTSP流媒体内容。这样可以通过使用Qt界面来实现丰富的用户体验。通过LibVLCQt的集成,可以实现播放RTSP流媒体直播、VOD、音频、视频等功能,并且可以进行多种操作,例如加速、暂停、截屏等。此外,由于LibVLC的跨平台特性,Qt应用程序可以在各种平台上运行,如Linux、macOS、Windows等。 总之,通过集成LibVLCQt,可以快速实现一个功能强大的RTSP流媒体播放器,为用户提供多种操作和定制化功能,同时增强了应用程序的可移植性。 ### 回答2: libvlc是一个功能强大的多媒体框架,提供了许多API用于播放、流媒体、录制等功能。qt是一个跨平台的GUI框架,可以与libvlc集成,用于显示播放器的用户界面。rtsp是实时流协议,可用于流媒体传输。 通过libvlcqt的组合,可以轻松创建强大的流媒体应用程序。具体而言,我们可以使用libvlc的API创建RTSP流服务器或客户端,并将qt用于显示流媒体内容。例如,我们可以使用libvlc的API从RTSP流服务器中获取流数据,并将它们显示在qt中。同时,qt也可以处理与流媒体相关的操作,如暂停、播放、跳转等。 总的来说,libvlc,Qt和RTSP的组合为流媒体应用程序提供了更多功能和更好的用户体验。通过这些工具,我们可以创建高度可定制的流媒体应用程序,满足用户的需求,带来更好的交互体验。 ### 回答3: libvlc qt rtsp是指在QT平台上使用libvlc开源框架实现RTSP协议的流媒体播放功能。libvlc是一个基于VLC(开源的跨平台媒体播放器)的核心组件,它提供了一整套C/C++编程接口可供开发者自由使用。 RTSP(Real Time Streaming Protocol)是一个标准的网络视频传输协议,支持实时音视频数据的传输和控制。为了在QT平台上实现RTSP协议的流媒体播放,我们可以使用libvlc的相关函数库和QT的多媒体组件进行开发。 使用libvlc qt rtsp可以方便地实现网络视频播放、暂停、停止等功能,并且支持直接从网络流源(类似于网络上的RTSP地址)中获取数据进行播放,无需先将视频下载到本地。 另外,使用libvlc qt rtsp还可以对RTSP协议进行深入研究和定制,比如自定义协议头、媒体文件格式等,以便更好地满足项目的具体需求。 总之,libvlc qt rtsp是一个高效、灵活的流媒体播放解决方案,能够帮助开发者在QT平台上轻松实现RTSP协议的视频播放功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值