Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >海康威视rtsp取流地址(海康威视设置教程)

海康威视rtsp取流地址(海康威视设置教程)

作者头像
全栈程序员站长
发布于 2022-08-01 04:38:03
发布于 2022-08-01 04:38:03
23.5K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

RTSP视频流显示(海康威视)

本文目的主要是想要实时显示海康威视的摄像头数据,笔者尝试了如下几种方式(部分未做完):

  • VLC
  • SDK(C++)
  • ffmpeg+Nginx
  • ffmpeg直接解码RTSP
  • AppEmit
  • WebComponentsKit插件

VLC

如果使用插件需要注意谷歌浏览器版本,本文是在官网下载的软件,下载下来安装并运行:

填的地址就是摄像头RTSP视频流地址,然后点串流:

左上角是这样的说明就已经在转换了:

网页显示

注意资源地址,同一局域网下的要访问就需要把localhost改为转换软件运行电脑的ip地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
	<title>Video</title>
</head>
<body>
	<video src="http://localhost:8080/test" width="350px" height="250px" controls="controls">
		不支持
	</video>
</body>
</html>

这种方式转换多路的时候,时间越久延迟会越大,实际运用操作起来比较麻烦。

VLC-Qt库

在知道视频地址的情况下可以使用插件库来解码视频,到官网下载需要的库文件:

下载完成后解压出来有如下3个文件夹:

  • include:包含了所需的头文件
  • lib:包含所需的 lib 文件
  • bin:包含了所需的 dll 文件(动态库及插件) 新建Qt工程:

在.pro文件中添加库所在路径

布局文件如下:

mainWindow.h文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QInputDialog>
#include <VLCQtCore/Common.h>
#include <VLCQtCore/Instance.h>
#include <VLCQtCore/Media.h>
#include <VLCQtCore/MediaPlayer.h>

QT_BEGIN_NAMESPACE
namespace Ui { 
    class MainWindow; }
QT_END_NAMESPACE

class VlcInstance;
class VlcMedia;
class VlcMediaPlayer;

class MainWindow : public QMainWindow
{ 
   
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void openLocal();
    void openUrl();

private:
    Ui::MainWindow *ui;

    VlcInstance *_instance;
    VlcMedia *_media;
    VlcMediaPlayer *_player;

};
#endif // MAINWINDOW_H

mainWindow.c文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{ 
   
    ui->setupUi(this);

    _instance = new VlcInstance(VlcCommon::args(), this);
    _player = new VlcMediaPlayer(_instance);
    _player->setVideoWidget(ui->video);
    ui->video->setMediaPlayer(_player);
    ui->volume->setMediaPlayer(_player);
    ui->volume->setVolume(50);
    ui->seek->setMediaPlayer(_player);

    connect(ui->openLocal, &QPushButton::clicked, this, &MainWindow::openLocal);
    connect(ui->openUrl, &QPushButton::clicked, this, &MainWindow::openUrl);
    connect(ui->stop, &QPushButton::clicked, _player, &VlcMediaPlayer::stop);
}

void MainWindow::openLocal()
{ 
   
    QString file =
            QFileDialog::getOpenFileName(this, tr("Open file"),
                                         QDir::homePath(),
                                         tr("Multimedia files(*)"));

    if (file.isEmpty())
        return;

    _media = new VlcMedia(file, true, _instance);

    _player->open(_media);
}

void MainWindow::openUrl()
{ 
   
    QString url =
            QInputDialog::getText(this, tr("Open Url"), tr("Enter the URL you want to play"));

    if (url.isEmpty())
        return;

    _media = new VlcMedia(url, _instance);

    _player->open(_media);
}


MainWindow::~MainWindow()
{ 
   
    delete _player;
    delete _media;
    delete _instance;
    delete ui;
}

使用发布版编译应用,程序会运行失败:

把下载的bin文件夹下所有文件复制到exe所在路径后再次编译运行即可:

这种方式不适合web端

SDK(C++)

本文使用环境如下:

  • 操作系统:win10 64位
  • Qt版本: 5.13.0
  • 编译器版本:mingw73_64

SDK下载。

一定要注意版本。

编写应用

  1. 下载SDK下来解压,复制如下需要的文件到工程:

改名为:

  1. 然后在.pro中添加库路径,:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LIBS+=$$PWD/libs/HCCore.lib
LIBS+=$$PWD/libs/HCNetSDK.lib
LIBS+=$$PWD/libs/GdiPlus.lib
LIBS+=$$PWD/libs/PlayCtrl.lib

LIBS+=$$PWD/libs/HCNetSDKCom/HCAlarm.lib
LIBS+=$$PWD/libs/HCNetSDKCom/HCGeneralCfgMgr.lib
LIBS+=$$PWD/libs/HCNetSDKCom/HCPreview.lib

添加头文件并包含:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <windows.h>
#include <head/HCNetSDK.h>

3. 再把库文件夹中所有dll文件放到编译后exe所在路径(有些用不上,但是全部找出来添加不会有问题):

4. 然后开始调用函数初始化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 初始化
	bool isok = NET_DVR_Init();
	if(isok == false)
	{ 
   
	    qDebug() << "NET_DVR_Init error;error number is " <<NET_DVR_GetLastError();
	    return;
	}
	//设置连接时间与重连时间
	NET_DVR_SetConnectTime(2000, 1);
	NET_DVR_SetReconnect(10000, true);

点击按钮开始连接(布局中只有一个名为faceRecognition的label和名为connectFaceRecognition的按钮):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int faceRecognitionRealPlayHandle = 0;
int faceRecognitionUserID = 0;

    if(ui->connectFaceRecognition->text() =="连接"){ 
   
        NET_DVR_DEVICEINFO_V30 deviceInfoTmp;
	
	// 摄像头IP,用户名和密码
        faceRecognitionUserID = NET_DVR_Login_V30("192.168.31.168",8000,"admin","chuanghai2017",&deviceInfoTmp);

        if(faceRecognitionUserID<0)
        { 
   
            errorCode = NET_DVR_GetLastError();
            QMessageBox::warning(NULL,"提示",QString("摄像头登陆失败! 错误码:%1").arg(errorCode));
            return;
        }

        //启动预览
        NET_DVR_PREVIEWINFO struPlayInfo;
        struPlayInfo.hPlayWnd = (HWND)ui->faceRecognition->winId();      //设置获取窗口句柄 需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
        struPlayInfo.lChannel = 1;       //预览通道号
        struPlayInfo.dwStreamType = 0;      //0-主码流,1-子码流,2-码流 3,3-码流 4,以此类推
        struPlayInfo.dwLinkMode = 0;      //0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP
        struPlayInfo.bBlocked = 1;      //0- 非阻塞取流,1- 阻塞取流
        struPlayInfo.dwDisplayBufNum = 15; //播放库播放缓冲区最大缓冲帧数
        faceRecognitionRealPlayHandle = NET_DVR_RealPlay_V40(faceRecognitionUserID, &struPlayInfo, NULL, NULL);
        if(faceRecognitionRealPlayHandle <0)
        { 
   
            errorCode = NET_DVR_GetLastError();
            QMessageBox::warning(NULL,"提示",QString("摄像头播放失败! 错误码:%1").arg(errorCode));
            NET_DVR_Logout(faceRecognitionUserID);
        }else{ 
   
            ui->connectFaceRecognition->setText("断开");
        }
    }else{ 
   
        //关闭预览
        NET_DVR_StopRealPlay(faceRecognitionRealPlayHandle);
        //注销用户
        NET_DVR_Logout(faceRecognitionUserID);
        ui->connectFaceRecognition->setText("连接");
    }

这种方式不适合web端

ffmpeg+Nginx

ffmpeg安装比较简单,下载下来把bin目录配置到环境变量,就OK了。

先运行nginx.exe(需要是已经集成rtmp模块的):

再打开cmd输入如下并回车:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ffmpeg -i "rtsp://admin:wls771102@192.168.14.175:554/h265/ch1/main/av_stream" -f flv -r 25 -s 640x360 -an rtmp://localhost:1935/live/room

看到这样的状态就可以访问rtmp://localhost:1935/live/room显示图像,不过需要浏览器支持rtmp:

这种方式丢帧明显,图像模糊。

直接使用ffmpeg解码视频

这里对这个demo作者表示感谢,写得确实已经很精简了,也就不说了,作者提到的关闭Shadow build:

在测试中发现有时候显示会有一半模糊具体原因还不太清除:

AppEmit

传送门 下载解压后,尝试运行demo获取rtsp视频流:

依次点击1、3即可看到画面,2位置的输入框需要按规则输入包含rtsp视频流地址信息的json格式描述,页面中列举了简单的测试案例:

主要代码提取出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>  <!-- manifest="/websocket.appcache"-->
<html >
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <title> rtsp demo</title>  
    <script type="text/javascript"> </script>
   <style type="text/css"> .Appboxs { 
      margin-top:10px; display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex;display: flex; display: box; display: flexbox; justify-content:space-around; } </style>  
</head>
<body >

<div class="container">
<input type="text" class="form-control" size="50" style="margin-bottom:3px;" id="input_url" value="ws://localhost:80/appemit?cid=00000-1&sid=1&flag=1" />
<button type="button" id="btn_Flash" onclick="init_App()" >初始化websocket(第一步)</button> 
    <div >  
		<div style="font-size:10px">libvlc:   	 	
		
		<!--双视频源 [{"emit":"open","Obj":"libvlc","AppType":1,"pos":1,"AppId":1,"par":{ "mrl":"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov","localFile":0},"par0":{"fullscreen":1,"volume":70,"autoplay":1,"controls":1 }},{"emit":"open","Obj":"libvlc","AppType":1,"pos":1,"AppId":2,"par":{ "engine":["--subsdec-encoding=GB18030", "--freetype-font=Microsoft JhengHei","--no-snapshot-preview","-I","dummy" ,"--ignore-config"],"mrl":"rtsp://192.168.161.224/1/h264major","localFile":0},"par0":{"fullscreen":true,"volume":70,"autoplay":true,"controls":true ,"snapPath":"/file/snap/" ,"snapFormat":".bmp","snapRBUTTONDBLCLK":1,"snapWidth":0,"snapHeight":0 }}]-->
		
		<!--单视频源 {"emit":"open","Obj":"libvlc","AppType":1,"pos":1,"AppId":1,"par":{ "mrl":"rtsp://192.168.161.224/1/h264major","localFile":0},"par0":{"fullscreen":1,"volume":70,"autoplay":1,"controls":1,"bgcolor":"2A2937"}}-->
			<input type="text" class="form-control" size="150" style="margin-bottom:3px;" id="input_par" value=' [{ 
    "emit":"open","Obj":"libvlc","AppType":1,"pos":1,"AppId":1,"par":{ "mrl":"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov","localFile":0},"par0":{ 
    "fullscreen":1,"volume":70,"autoplay":1,"controls":1 }},{ 
    "emit":"open","Obj":"libvlc","AppType":1,"pos":1,"AppId":2,"par":{ "engine":["--subsdec-encoding=GB18030", "--freetype-font=Microsoft JhengHei","--no-snapshot-preview","-I","dummy" ,"--ignore-config"],"mrl":"rtsp://192.168.161.224/1/h264major","localFile":0},"par0":{ 
    "fullscreen":true,"volume":70,"autoplay":true,"controls":true ,"snapPath":"/file/snap/" ,"snapFormat":".bmp","snapRBUTTONDBLCLK":1,"snapWidth":0,"snapHeight":0 }}]'/>
			<button type="button" id="btn_1" onclick="input_App() " >开始(第二步)</button>
		</div>      
	</div>
     <div class="Appboxs" >
		<!-- textarea或者改为div 都可以,绑定嵌入APP的位置, AppEmbed 要一致。如果要跟随浏览器变化大小,设置相对%比例即可-->
 		<div id="AppEmbed1" style="border: solid 1px #F0F0F0; min-width:30px;min-height:20px;width:400px;height:360px" ></div>
		<div id="AppEmbed2" style="border: solid 1px #F0F0F0;min-width:30px;min-height:20px;width:400px;height:360px" ></div>   
	</div>
<!--<script type="text/javascript" src="https://cdn.bootcss.com/pako/1.0.11/pako.min.js"></script> 如果使用Gzip压缩解压数据,则需要引入-->
  <script type="text/javascript" src="AppEmit_1.2_min.js"></script>
<script> //init_App(); //载入页面运行  var init_App=function(){ 
      AE.InitApp(document.getElementById('input_url').value); } var input_App= function(Jdata){ 
      //回调的数据Jdata var ReqPar0={ 
     }; ReqPar0=JSON.parse(document.getElementById("input_par").value); // AE.OpenApp(ReqPar); //执行文本框里的内容 AE.OpenApp(ReqPar0); } </script>
</body>
</html>

WebComponentsKit插件

测试文件下载地址,在nginx-1.10.2\www\hik\codebase下有WebComponentsKit插件,需要先安装。

nginx的配置文件中如下两部分必须:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#websocket相关配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;


location ~ /ISAPI|SDK/ {
	if ($http_cookie ~ "webVideoCtrlProxy=(.+)") {
	proxy_pass http://$cookie_webVideoCtrlProxy;
	break;
	}
}
location ^~ /webSocketVideoCtrlProxy {
	#web socket
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_set_header Host $host;

	if ($http_cookie ~ "webVideoCtrlProxyWs=(.+)") {
	proxy_pass http://$cookie_webVideoCtrlProxyWs/$cookie_webVideoCtrlProxyWsChannel?$args;
	break;
	}
	if ($http_cookie ~ "webVideoCtrlProxyWss=(.+)") {
	proxy_pass http://$cookie_webVideoCtrlProxyWss/$cookie_webVideoCtrlProxyWsChannel?$args;
	break;
	}
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126506.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QT软件开发: 基于FFMPGE设计的流媒体播放器(rtmp/rtsp)
完整工程下载地址(下载即可编译运行): ffmpeg流媒体播放器.zip_qt流媒体播放器-直播技术文档类资源-CSDN下载
DS小龙哥
2022/01/12
3.1K0
QT软件开发: 基于FFMPGE设计的流媒体播放器(rtmp/rtsp)
网页播放rtsp视频流
GitHub – vbence/stream-m: An HTML5-compatible live streaming server supporting the WebM and H.264 formats.
全栈程序员站长
2022/11/02
2.8K0
QT软件开发:基于libVLC内核设计视频播放器
完整工程下载地址(下载即可编译运行): VLC_Core_VideoPlayer.zip-QT文档类资源-CSDN下载
DS小龙哥
2022/01/12
3.2K2
QT软件开发:基于libVLC内核设计视频播放器
Qt开源作品2-视频流播放vlc内核
上一个作品是ffmpeg内核做的,由于ffmpeg太过于强大,很多初学者会看的云里雾里懵逼状态,也有很多用户只需要一个简单的播放视频流即可,根本不需要涉及到负责的解码转码等,于是vlc就上场了,他就是直接对ffmpeg做了深层次的封装,提供了友好的接口,具备这种境界的还有个mpv之类的,mpv相比于vlc还更牛逼在库文件就一个,貌似是封装成了静态库,不想vlc还要带一堆的动态库文件和插件文件,当然vlc的简单在于只需要几行代码就可以撸起来,让初学者看到效果很重要,很兴奋,可以更快速的进行下一步的编码中,体验编码的乐趣。
feiyangqingyun
2020/04/26
1K0
Qt开源作品2-视频流播放vlc内核
Qt编写视频播放器(vlc内核)[通俗易懂]
在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外。用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情,最好加点美化那就更加完美了,市面上很多播放器是vlc内核写的,或者ffmpeg写的。 可执行文件下载:https://pan.baidu.com/s/1KHTsgQUvtzWa3rLB_Tmo7A
全栈程序员站长
2022/09/19
1.8K0
Qt编写视频播放器(vlc内核)[通俗易懂]
嵌入式Qt-FFmpeg设计一个RTSP播放器
上篇文章,介绍了FFmpeg的交叉编译,以及在嵌入式Linux平台,运行ffmpeg指令来播放视频。
xxpcb
2022/10/04
1.4K0
嵌入式Qt-FFmpeg设计一个RTSP播放器
QT5.14.2编译部署QTAV播放器环境
QTAV是开源的跨平台的播放器框架,框架是基于QT开发的,可以在Android、IOS、WINDOWS、Linux各个平台编译部署运行。
DS小龙哥
2022/01/12
1.6K0
QT5.14.2编译部署QTAV播放器环境
QT应用编程:基于VLC开发音视频播放器(句柄方式)
完整项目代码下载地址: https://download.csdn.net/download/xiaolong1126626497/16579867
DS小龙哥
2022/01/07
1.5K0
QT应用编程:基于VLC开发音视频播放器(句柄方式)
采用libvlc做一个视频播放器
VLC这个播放器(只要涉及到软件开发)基本应该都听过用过,其功能的强大就不多说了。 VLC媒体播放器官网: https://www.videolan.org/
DS小龙哥
2024/05/24
9910
采用libvlc做一个视频播放器
QT应用编程: 基于FFMPEG设计的流媒体播放器(播放rtmp视频流)
使用的FFMPEG库版本下载地址:https://download.csdn.net/download/xiaolong1126626497/12304729
DS小龙哥
2022/01/07
4.3K2
QT应用编程: 基于FFMPEG设计的流媒体播放器(播放rtmp视频流)
QT应用编程: 基于mdk-sdk开发视频播放器
github 首页地址: https://github.com/wang-bin/mdk-sdk
DS小龙哥
2022/01/07
2.3K0
QT应用编程:  基于mdk-sdk开发视频播放器
Vlc for Android 全面阐述
Vlc for android是一款开源安卓播放器。具备播放多媒体文件、光盘、设备以及网络流媒体协议等功能,支持ARMv7 CPU或一个x86 CPU的设备,全部播放控制特性都已经开发完整。
全栈程序员站长
2022/07/08
4.3K0
Vlc for Android 全面阐述
RTSP H264/HEVC 流 Wasm 播放
本文将介绍 RTSP H264/HEVC 裸流如何于网页前端播放。涉及 WebSocket 代理发送流数据, Wasm 前端解码等。
GoCoding
2021/09/29
2.9K0
linux下使用QT调用FFMPEG读取摄像头一帧数据显示到标签控件上
下面代码调用FFMPEG库,读取摄像头的一帧数据,转换为RGB888,加载到QImage,再显示到标签控件上。
DS小龙哥
2022/01/12
1.7K0
linux下使用QT调用FFMPEG读取摄像头一帧数据显示到标签控件上
QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)
QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537
DS小龙哥
2023/01/30
2.4K1
RTSP?不存在的 -> 前端实时流探索记
传送门:https://segmentfault.com/a/1190000022994032
ConardLi
2020/07/07
3.2K0
Nginx+FFmpeg打造自己的视频直播服务
现在很多项目都有视频实时播放的功能需求,例如监控,直播等,原始的摄像头采集的视频流协议一般都是 rtsp 协议,在旧版的浏览器中使用
ruochen
2021/11/24
6.1K0
[保姆级教程]SRS直播服务器搭建兼ffmpeg推流+obs在线直播+集成
最近一星期一直在研究直播原理和推流操作,网上的教程十分零散,你会发现每个搜索页面点进去都是同个文章,这... 经过我独立研究和网上学习,终于终于走完了基本的直播推流操作。我将互联网零散的知识和自己的理解全部集成在这。此文章为原创,当中会引用不少大佬伟大的项目 感谢以下伟大的项目
yimi233
2022/11/09
6.1K0
[保姆级教程]SRS直播服务器搭建兼ffmpeg推流+obs在线直播+集成
[保姆级教程]SRS直播服务器搭建兼ffmpeg推流+obs在线直播+集成
最近一星期一直在研究直播原理和推流操作,网上的教程十分零散,你会发现每个搜索页面点进去都是同个文章,这... 经过我独立研究和网上学习,终于终于走完了基本的直播推流操作。我将互联网零散的知识和自己的理解全部集成在这。此文章为原创,当中会引用不少大佬伟大的项目
yimi233
2022/10/12
9.9K4
[保姆级教程]SRS直播服务器搭建兼ffmpeg推流+obs在线直播+集成
如何开发一款 H5 小程序直播?
大前端这几年算是一个热词,对于前段来说如果不是大前端,技术相对来说就已经算是落后了。如果还停留在对ES6,Vue这些基本技能的学习只能说处于一个及格线。
Nealyang
2021/01/14
3.7K0
如何开发一款 H5 小程序直播?
推荐阅读
相关推荐
QT软件开发: 基于FFMPGE设计的流媒体播放器(rtmp/rtsp)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验