精华内容
下载资源
问答
  • Qt显示视频流——(三)

    千次阅读 2019-08-19 19:50:51
    之前的两次我们已经搭建好了nginx+rtmp服务和ffmpeg推流工具,本次进行最后一步结合Qt显示视频流。1.接入硬件摄像头我使用的是UVC摄像头,也可以接入笔记...

     

     

    之前的两次我们已经搭建好了nginx+rtmp服务和ffmpeg推流工具,本次进行最后一步结合Qt显示视频流。

     

    1. 接入硬件摄像头

    我使用的是UVC摄像头,也可以接入笔记本电脑自带的相机。在终端上使用ls /dev/vide* 查看一下相机是否被识别,如果识别,则会返回/dev/video0。

    如果向查看更具体的其他关于相机的信息,可以使用dmesg命令查看。

     

    2. 启动nginx

    cd /usr/local/dev_workspace/nginx/sbin

    sudo ./nginx

     

    可通过网页访问localhost检查nginx是否启动成功

     

    3. 使用ffmpeg从相机得到视频并推流

     

    ①安装ffmpeg所使用的配置参数

      configuration: --enable-shared --prefix=/usr/local/dev_workspace/ffmpeg --enable-libmp3lame --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-postproc --enable-ffplay --enable-libx264 --enable-libxvid --disable-x86asm

     

    ②安装ffmpeg所需依赖库

    如果之前没安装过,一般都会缺这几个

    sudo apt­get install libmp3lame­dev

    sudo apt­get install libx264­dev

    sudo apt­get install libxvidcore­dev

     

    ③推流命令参数

    ./ffmpeg -f video4linux2 -i /dev/video0 -f flv rtmp://localhost:1935/hls/video

    注意这里是推流到本机,推到其他地方对应更换ip

     

    结果如图:

    640?wx_fmt=png

    4. 使用Qt显示视频流

    终于到这了,千呼万唤始出来!

     

    ①安装flash插件

    sudo apt­get update

    sudo apt­get install flashplugin­installer

     

    ② Qt程序

    pro中添加webkitwidgets模块,ui中拖一个QWebView控件。

     

     

    ui->webView->settings()->setAttribute(QWebSettings::PluginsEnabled,true);	
        ui->webView->settings()->setAttribute(QWebSettings::JavaEnabled,true);	
        ui->webView->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);	
        ui->webView->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);	
        ui->webView->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard,true);	
        ui->webView->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);	
        ui->webView->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled,true);	
        ui->webView->settings()->setAttribute(QWebSettings::LinksIncludedInFocusChain,true);	
        ui->webView->settings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled,true);	
        ui->webView->settings()->setAttribute(QWebSettings::AutoLoadImages,true);	
    
    	
        ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);	
    
    	
        ui->webView->setUrl(QUrl("http://192.168.1.22/rtmp/video.html"));

     

    注意下,这里的ip是服务的ip,ffmpeg与nginx可能是分离开的。

     

    过程是艰辛的,但是结果是美好的:

     

    1>

    640?wx_fmt=png

     

    2>

    640?wx_fmt=png

     

     

    欢迎大家关注公众号:

    640?wx_fmt=png

     

    展开全文
  • Qt 显示视频流——安装ffmpeg(一)

    千次阅读 2019-08-16 23:19:03
    最近项目中有这样一个需求:需要从相机中读取视频流,然后利用Qt显示实时视频流。最终使用的是这样的结构:ffmpeg从USB免驱相机中获取视频流,然后推流到nginx服务...

     

    最近项目中有这样一个需求:需要从相机中读取视频流,然后利用Qt显示实时视频流。

     

    最终使用的是这样的结构:ffmpeg从USB免驱相机中获取视频流,然后推流到nginx服务器上。最后Qt使用WebView拉取Url中的视频流。

     

    这次和大家介绍下linux下安装ffmpeg。

    ffmpeg怎么读——大家和我一起读:“ef ef em peg”

     

    ffmpeg是一个很强大的音视频处理工具,官网是:http://ffmpeg.org/ 官网介绍ffmpeg是:一个完整的、跨平台的解决方案,可以记录、转换和传输音频和视频。

     

    1.下载源码安装包,我习惯直接右键解压

    640?wx_fmt=png

    2.安装

    ①直接./configure出错

    640?wx_fmt=png错误的意思是 yasm/nasm 包不存在或者很旧,解决方法是安装yasm.

     

    640?wx_fmt=png

     

     

    下载后解压

                    ./configure

        make

        sudo make install

     

    编译参数都是默认的,直接安装到系统中即可,安装成功之后继续回到ffmpeg解压后的目录,执行下面命令编译并安装:

     

    ②安装ffmpeg

                     ./configure --enable-shared --prefix=/tmp/ffmpeg

        make

                     sudo make install

     

    编译过程有点长,耐心等待。

    完成之后执行 cd /tmp/ffmpeg/ 进入安装目录,查看一下发现有bin,include,lib,share这4个目录,其中bin是ffmpeg主程序二进制目录,include是C/C++头文件目录,lib是编译好的库文件目录,share是文档目录.

     

    之后将ffmpeg目录复制到/usr/local/dev_workspace(自建)下,然后进入bin目录,执行 ./ffmpeg -version 查看当前版本的详细信息,默认情况下一般会报libavdevice.so.58: cannot open shared object file: No such file or directory,原因是lib目录未加载到链接到系统库中。解决方法是在/etc/ld.so.conf中添加一个ffmpeg.conf文件,文件内容如下。然后执行 ldconfig 使配置生效,现在再次执行 ./ffmpeg -version 显示就正常了

     

    640?wx_fmt=png

     

    查看结果如图:

    之前安装时目录写错了,所以是图中的效果。

     

    640?wx_fmt=png

    安装ffmpeg仅是其中第一步,而且安装时还有很多参数没有设置,下次会结合USB摄像头作具体的应用。

     

    本文主要参考https://www.cnblogs.com/freeweb/p/6897907.html ,并添加一些自己的实际安装时的截图,方便以后再次使用。

     

    欢迎大家关注公众号:

     

    640?wx_fmt=png

     

     

     

     

     

     

     

    展开全文
  • 环境为Qt5.9.6+MinGW32环境,可以实现三通道视频播放和截图
  • 上次介绍的是使用ffmpeg推,这次介绍的是使用nginx + rtmp搭建直播服务器。 环境:ubuntu 16.04 一、安装nginx 和 rtmp模块 1.下载安装nginx 和 nginx-rtmp 编译依赖工具 sudo apt-get install -y curl build-...

     

     

    上次介绍的是使用ffmpeg推流,这次介绍的是使用nginx + rtmp搭建直播服务器。

    环境:ubuntu 16.04

    一、 安装nginx 和 rtmp模块

    1. 下载安装 nginx 和 nginx-rtmp 编译依赖工具

    sudo apt-get install -y curl build-essential libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev

     

    2. 创建编译所用目录

    mkdir -p ~nginx_src

    cd ~nginx_src

     

    3. 下载nginx源码包并解压

    wget http://nginx.org/download/nginx-1.11.8.tar.gz

    tar -zxvf nginx-1.11.8.tar.gz

     

    4. 下载 nginx-rtmp-module模块 源码包(RTMP模块源码包)并解压

    wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

    unzip master.zip

     

    5. 进入nginx目录设定编译参数

    cd  cd nginx-1.11.8

    ./configure--prefix=/usr/local/dev_workspace/nginx --add-module=../nginx-rtmp-module-master --with-http_ssl_module

     

    6. 编译安装

    make

    sudo make install

     

    注意:如果没有安装第一步的依赖工具,可能出现以下错误:

     ./configure: error: the HTTP rewrite module requires the PCRE library.………………………………

     

    7. 完成验证

    操作如图:

    640?wx_fmt=png

     

    二、 修改nginx配置文件添加rtmp服务

     

    1. 配置文件目录

    /usr/local/dev_workspace/nginx/nginx.conf

     

    2. 添加以下内容

     rtmp {      

            server {    

                listen 1935; #监听的端口

                chunk_size 4000;     

                application hls {

                    live on;     

                }   

            }   

        }

     

    注意:①直接配置文件增加   与http协议同级

    ②修改前先将原文件.bak备份

     

    至此,nginx 及nginx-rtmp-module部分配置完成 。

     

     

    三、安装Strobe Media Playback

    1. 下载网址 https://sourceforge.net/projects/smp.adobe/

    在/usr/local/dev_workspace/nginx/html下新建rtmp文件夹

    解压好后将for Flash Player 10.1复制到rtmp文件夹下并重命名为strobe

    cp -r for Flash Player 10.1/  /usr/local/dev_workspace/nginx/html/rtmp/strobe

     

    2.在/usr/local/dev_workspace/nginx/html/rtmp下新建一个video.html

        程序如下:

     

    <!DOCTYPE html>	
    <html>	
    <head>	
    <title>Live Streaming</title>	
     	
    <!-- strobe -->	
    <script type="text/javascript" src="strobe/lib/swfobject.js"></script>	
    <script type="text/javascript">	
      var parameters = {  	
         //src: "rtmp://{pi_address}/rtmp/live",	
       src: "rtmp://192.168.15.129:1935/hls/video",	
         autoPlay: false,  	
         controlBarAutoHide: false,  	
         playButtonOverlay: true,  	
         showVideoInfoOverlayOnStartUp: true,  	
         optimizeBuffering : false,  	
         initialBufferTime : 0.1,  	
         expandedBufferTime : 0.1,  	
         minContinuousPlayback : 0.1,  	
         poster: "images/poster.png"  	
      };  	
      swfobject.embedSWF(	
        "strobe/StrobeMediaPlayback.swf"	
        , "StrobeMediaPlayback"	
        , 1024	
        , 768	
        , "10.1.0"	
        , "strobe/expressInstall.swf"	
        , parameters	
        , {	
          allowFullScreen: "true"	
        }	
        , {	
          name: "StrobeMediaPlayback"	
        }	
      );	
    </script>	
     	
    </head>	
    <body>	
    <div id="StrobeMediaPlayback"></div>	
    </body>	
    </html>

     

    注意:①"rtmp://192.168.15.129:1935/hls/video"该地址是ffmpeg推流

            到的虚拟目录,

          ②, 1024, 768 这两个参数是视频流的长和宽,根据Qt设置的

                    WebView进行调整。否则只调整WebView是没有用的。

     

    至此,nginx+rtmp以及Strobe Media Playback安装并且配置完成了。

    下次将根据项目需要,给ffmpeg安装一些其他库,并且使用qt的webview通过Url显示视频流.

     

    最后附上经典参考文献连接:

    https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/

     

     

    欢迎大家关注公众号:

    640?wx_fmt=png

     

    展开全文
  • QT+Opencv实现视频流播放

    千次阅读 2020-09-23 14:36:38
    首先通过opencv打开视频流,获取到数据帧,然后将数据帧转换为QT可识别的图像,显示到QT界面上。 2.opencv解码线程源码 //DecodeOpencv.h #pragma once #include <QThread> #include <QObject> ...

    1.简单流程

     首先通过opencv打开视频流,获取到数据帧,然后将数据帧转换为QT可识别的图像,显示到QT界面上。

    2.opencv解码线程源码

    //DecodeOpencv.h
    
    #pragma once
    
    #include <QThread>
    #include <QObject>
    
    #include "opencv2/core/core.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    
    class DecodeOpencv : public QThread
    {
    	Q_OBJECT
    
    Q_SIGNALS:
    	void sigSendFrame(cv::Mat mat);
    
    public:
    	DecodeOpencv(QObject *parent = nullptr);
    	~DecodeOpencv();
    
    public:
    	void setUrl(QString url);
    
    	void setStoped(bool stop);
    
    protected:
    	void run();
    
    private:
    	QString m_rtsp;
    
    	bool m_isStop = false;
    };
    
    //DecodeOpencv.cpp
    
    #include "DecodeOpencv.h"
    #include <QDebug>
    
    DecodeOpencv::DecodeOpencv(QObject *parent)
    	: QThread(parent)
    {
    	qRegisterMetaType<cv::Mat>("cv::Mat");
    }
    
    DecodeOpencv::~DecodeOpencv()
    {
    	m_isStop = true;
    }
    
    void DecodeOpencv::setUrl(QString url)
    {
    	m_rtsp = url;
    }
    
    void DecodeOpencv::setStoped(bool stop)
    {
    	m_isStop = stop;
    }
    
    void DecodeOpencv::run()
    {
    	cv::VideoCapture cap;
    
    	if (m_rtsp.isEmpty())
    	{
    		qDebug() << "未找到视频流地址";
    		return;
    	}
    	bool suc = false;
    	if (m_rtsp.contains("localhost:camera"))
    	{
    		suc = cap.open(0); //打开本地摄像头
    	}
    	else
    	{
    		suc = cap.open(m_rtsp.toStdString()); //打开网络流地址
    	}
    
    	if (!suc)
    	{
    		qDebug() << "播放失败";
    		return;
    	}
    
    	while (true)
    	{
    		if (!m_isStop)
    		{
    			cv::Mat frame;
    			cap >> frame;
    			if (frame.empty())
    			{
    				qDebug() << "播放帧解析失败";
    				continue;
    			}
    			emit sigSendFrame(frame);
    		}
    		else
    		{
    			qDebug() << "停止播放";
    			break;
    		}
    	}
    }
    

    3.QT界面

     

    //ShowMatWidget.h
    
    #pragma once
    
    #include <QWidget>
    #include "ui_ShowMatWidget.h"
    #include "DecodeOpencv.h"
    
    class ShowMatWidget : public QWidget
    {
    	Q_OBJECT
    
    public:
    	ShowMatWidget(QWidget *parent = Q_NULLPTR);
    	~ShowMatWidget();
    
    private Q_SLOTS:
    	void slotBtnConnected();
    
    	void slotGetFrame(cv::Mat mat);
    
    	QImage cvMat2QImage(const cv::Mat& mat);
    
    private:
    	Ui::ShowMatWidget ui;
    
    	DecodeOpencv *m_thread = nullptr;
    };
    

    //ShowMatWidget.cpp
    
    #include "ShowMatWidget.h"
    
    #include <QDebug>
    
    ShowMatWidget::ShowMatWidget(QWidget *parent)
    	: QWidget(parent)
    {
    	ui.setupUi(this);
    
    	m_thread = new DecodeOpencv(this);
    
    	connect(m_thread, &DecodeOpencv::sigSendFrame, this, &ShowMatWidget::slotGetFrame);
    
    	connect(ui.pushButton, &QPushButton::clicked, this, &ShowMatWidget::slotBtnConnected);
    }
    
    ShowMatWidget::~ShowMatWidget()
    {
    }
    
    void ShowMatWidget::slotBtnConnected()
    {
    	m_thread->setUrl(ui.lineEdit->text());
    	m_thread->start();
    }
    
    void ShowMatWidget::slotGetFrame(cv::Mat mat)
    {
    	QImage image = cvMat2QImage(mat);
    
    	ui.label->setPixmap(QPixmap::fromImage(image));
    }
    
    QImage ShowMatWidget::cvMat2QImage(const cv::Mat& mat)
    {
    	//8位,通道数为1
    	if (mat.type() == CV_8UC1)
    	{
    		QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
    		image.setColorCount(256);
    		for (int i = 0; i < 256; i++)
    		{
    			image.setColor(i, qRgb(i, i, i));
    		}
    
    		uchar *pSrc = mat.data;
    		for (int row = 0; row < mat.rows; row++)
    		{
    			uchar *pDest = image.scanLine(row);
    			memcpy(pDest, pSrc, mat.cols);
    			pSrc += mat.step;
    		}
    		return image;
    	}
    	//8位,通道数为3
    	else if (mat.type() == CV_8UC3)
    	{
    		const uchar *pSrc = (const uchar*)mat.data;
    		QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
    		return image.rgbSwapped();
    	}
    	//8位,通道数为4
    	else if (mat.type() == CV_8UC4)
    	{
    		qDebug() << "CV_8UC4";
    
    		const uchar *pSrc = (const uchar*)mat.data;
    		QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
    		return image.copy();
    	}
    	//32位,通道数为3
    	else if (mat.type() == CV_32FC3)
    	{
    		cv::Mat temp;
    		mat.convertTo(temp, CV_8UC3);
    
    		const uchar *pSrc = (const uchar*)temp.data;
    		QImage image(pSrc, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    		return image.rgbSwapped();
    	}
    	else
    	{
    		qDebug() << "ERROR: Mat could not be converted to QImage.";
    		return QImage();
    	}
    }
    

    展开全文
  • Qt窗口上显示kinect摄像头捕获的彩色视频流。用了kinect for windows SDK。
  • ubuntu qt_av播放视频流

    2021-03-16 14:27:56
    qt_av 播放视频流安装环境ubuntu16.04 qt5.9.6qt_av和ffmpeg库的安装ffmpeg和qt_av库下载 安装环境 ubuntu16.04 qt5.9.6 qt_av和ffmpeg库的安装 ffmpeg和qt_av库下载 下载好ffmpeg后进入ffmpeg文件夹 在终端运行./...
  • Qt+FFmpeg播放RTSP H264视频流(3)- RTSP视频流播放

    千次阅读 热门讨论 2019-07-06 15:36:04
    使用Qt,FFmpeg播放rtsp视频流
  • Qt 中使用 VLC-Qt 播放网络视频流(附实例)

    千次阅读 热门讨论 2020-05-26 13:35:37
    VLC-Qt库:一个在libVLC基础上结合了Qt框架的开源库。它提供了媒体播放的视频、音频处理控制的核心类,并提供基于QWidget和QML的GUI框架。
  • QT 利用opencv获取显示视频流预览

    千次阅读 2019-09-01 17:36:59
    QT中,如果我们想做一些关于读取摄像头视频里显示的操作,可以使用opencv非常方便的读取视频流,还可以对读取的帧数据进行一些特殊的处理,例如:灰白显示,边缘显示等等。下面是一个非常基础的使用opencv的demo ...
  • 该文章主要介绍如何在Qt5开发环境下,使用海康威视SDK将视频流显示在界面上的具体方法。
  • windows中,Qt渲染YUV数据,把yuv_420格式的视频流通过opengl进行实时的显示
  • 这几种情况我都先后都试了,播放本地视频没用问题,但是播放rtsp时,有这么几个问题记录下: 1、LAVFilters 播放卡顿、帧顺序错乱;安装包10M左右,方便安装; 2、K-Lite_Codec_Pack效果不错;安装包17M左右,...
  • vs2017+qt+ffmpeg 开发的视频播放工具,最简单的播放功能,可以播放rtsp,rtmp,udp
  • Qt开源作品1-视频流播放ffmpeg内核

    千次阅读 2020-04-24 15:07:21
    一、前言 好久以前就写过这个工具,后来因为Qt版本的不断升级以及ffmpeg也经历过好多次的迭代,可能从官网下载的ffmpeg搭配原来的代码不能正确编译,因为很多api已经变了,...同时解码视频流和音频流 支持任意Qt版...
  • Qt5.9.1 使用Qt_Vlc库创建简单的RTSP流视频和本地视频播放器,包含Qt_Vlc库生成的详细步骤及工具,生成的VS2015工程文件,同时把5.9.1下生成的库文件及示例源码一起奉上,希望对大家有帮助,全网最详细关于Qt_vlc...
  • 实现了一路Qt + FFmpeg RTSP视频流的解码,调用FFmpeg API实现,版本为FFmpeg 4.1.2。实测视频延迟为200ms 以内,已达到商业使用标准。
  • Qt版本:5.11 64位 ffmpeg版本:>3.064位 2.实现思路 ffmpeg拉流、解码,因为Qt不支持显示yuv数据,需要ffmpeg转换为rgb数据,再用QImage显示,这种方式性能会不好,暂时先实现这种简单的。一般情况下会用...
  • Qt+OpenGL在立方体表面显示视频流

    热门讨论 2013-03-02 21:05:46
    Qt框架下使用OpenGL,在空间中绘制一个立方体,把摄像头捕获的视频流当做OpenGL贴图,实时地贴到立方体各个表面上。可以用键盘的上下左右键,来旋转立方体,以便观察效果。"L"键切换光照模式。
  • avformat_alloc_output_context2()初始化输出文件的上下文 avcodec_find_encoder()找到音视频编码器 avformat_new_stream()创建新的音视频流 avcodec_open2()打开编码器 avio_open()打开MP4文件,准备往里面写入...
  • FFmpeg学习之五(视频流播放--Qt
  • vlc-qt是一个国外大佬做的基于QT和VLC的开源项目,官网:https://vlc-qt.tano.si/ 在他的官网上可以找到项目的源代码(在git上),以及发行版。 对于开发者来说,使用他的发行版是不够的,如下图所示,只提供了...
  • QML中使用 VLC-Qt 播放网络视频流(附实例)

    千次阅读 热门讨论 2020-07-23 13:05:51
    VLC-Qt库:一个在libVLC基础上结合了Qt框架的开源库。它提供了媒体播放的视频、音频处理控制的核心类,并提供基于QWidget和QML的GUI框架。QWidget中使用VLC方法见我博文:... 此文介绍在QML中使用VLC播放网络流视频
  • } (2)初始化视频流线程: initthread.h #ifndef INITTHREAD_H #define INITTHREAD_H #include "basicthread.h" class initthread : public basicthread { Q_OBJECT public: initthread(QObject*parent=nullptr);...
  • Qt视频开发49-通用截图截屏

    千次阅读 2020-11-24 08:52:46
    采用了回调方式的视频通道,截图只需要对解析好的QImage对象直接保存即可,而对于句柄的形式,需要调用不同的处理策略,比如vlc需要用它自己提供的api接口函数libvlc_video_take_snapshot传入保存路径即可,mpv的...
  • 最近到了大四,想对大学期间做过的项目进行回顾和总结,故写此博客。 其中的一个项目就是视频监控的智能小车,此...在服务端,我使用QT中的label控件来接受视频流,并设计UI进行运动控制。 二、确定服务端接受...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,110
精华内容 4,444
关键字:

qt截图视频流