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

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

  • VLC
  • SDK(C++)
  • ffmpeg+Nginx
  • ffmpeg直接解码RTSP

VLC

如果使用插件需要注意谷歌浏览器版本,本文是在官网下载的软件,下载下来安装并运行:
在这里插入图片描述
填的地址就是摄像头RTSP视频流地址,然后点串流:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
左上角是这样的说明就已经在转换了:
在这里插入图片描述
网页显示注意资源地址,同一局域网下的要访问就需要把localhost改为转换软件运行电脑的ip地址:

<!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>

在这里插入图片描述
这种方式转换多路的时候,时间越久延迟会越大。

SDK(C++)

本文使用环境如下:

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

SDK下载。

一定要注意版本。
在这里插入图片描述

编写应用

  1. 下载SDK下来解压,复制如下需要的文件到工程:
    在这里插入图片描述
    改名为:
    在这里插入图片描述
  2. 然后在.pro中添加库路径,:
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

添加头文件并包含:

#include <windows.h>
#include <head/HCNetSDK.h>

在这里插入图片描述
3. 再把库文件夹中所有dll文件放到编译后exe所在路径(有些用不上,但是全部找出来添加不会有问题):
在这里插入图片描述
4. 然后开始调用函数初始化:

	// 初始化
	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的按钮):

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("连接");
    }

在这里插入图片描述

ffmpeg+Nginx

ffmpeg安装比较简单,下载下来把bin目录配置到环境变量,就OK了。
在这里插入图片描述
先运行nginx.exe(需要是已经集成rtmp模块的):
在这里插入图片描述
再打开cmd输入如下并回车:

ffmpeg -i "rtsp://admin:[email protected]: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:
在这里插入图片描述
在测试中发现有时候显示会有一半模糊具体原因还不太清除,如果有读者知道也请赐教:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u012902367/article/details/93714393