QT——http协议(大华摄像头保活,根据Id获取大华摄像头播放地址rtsp流)

.cpp文件
详情请看代码注释

#include "customize_files/network_manager.h"
#include <QDir>
#include <QCoreApplication>
#include <QEventLoop>
#include <iostream>
#include <QJsonObject>
std::shared_ptr<NetworkManager> NetworkManager::_instPtr{nullptr};
std::mutex NetworkManager::mutex_;
//单例模式
std::shared_ptr<NetworkManager> NetworkManager::getSingletonPtr() {
	if (!_instPtr) {
		std::lock_guard<std::mutex> gLock(mutex_);
		if (_instPtr == nullptr) {
			_instPtr.reset(new NetworkManager, [](NetworkManager* inst) {delete inst; });
		}
	}
	return _instPtr;
}

NetworkManager::NetworkManager(QObject* parent) {
	netAccessMgr_ = std::make_shared<QNetworkAccessManager>();
}

NetworkManager::~NetworkManager() {
}
// path 对应URL,QNetworkAccessManager::Operation operation,http的三种方式pos,put,get,(还有一种,本文没写),QByteArray data对应传递的请求头,或者内容,
void NetworkManager::fetchServerData(QString path, QNetworkAccessManager::Operation operation, QByteArray data, bool sync) {
	QUrl url(path);
	QNetworkRequest request(url);
	QNetworkReply* reply = NULL;
	//request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");//application/json
	if (operation == QNetworkAccessManager::GetOperation) {
		reply = netAccessMgr_->get(request);
	}
	else if (operation == QNetworkAccessManager::PostOperation) {
		reply = netAccessMgr_->post(request, data);
	}
	else {
		reply = netAccessMgr_->put(request, data);
	}

	if (sync) {
		// 同步
		QEventLoop loop;
		connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
		loop.exec();
		if (reply->error() == QNetworkReply::NoError) {
			QString strReply = (QString)reply->readAll();
			QJsonParseError jsonError;
			QJsonDocument jsonDocument = QJsonDocument::fromJson(strReply.toUtf8(), &jsonError);
			if (jsonError.error == QJsonParseError::NoError) {
				emit queryServerSuccessed(reply->url().path(), jsonDocument);
			}
		}
		else {
			//Failed;
			QString strReply = (QString)reply->readAll();
			QJsonParseError jsonError;
			QJsonDocument jsonDocument = QJsonDocument::fromJson(strReply.toUtf8(), &jsonError);
			QJsonObject objs = jsonDocument.object();
			QByteArray byteArray = jsonDocument.toJson(QJsonDocument::Compact);
			QString strJson(byteArray);
			emit errorServerSuccessed(reply->url().path(), jsonDocument);
		}
	}
	else
	{
		//异步
		connect(netAccessMgr_.get(), SIGNAL(finished(QNetworkReply*)), this, SLOT(handleAsyncRequestFinished(QNetworkReply*)));
	}
}
//这个跟上一个一样,直接返回结果
QJsonDocument NetworkManager::receiveHttpData(QString path, QNetworkAccessManager::Operation operation, QByteArray data, bool sync)
{
	QUrl url(path);
	QNetworkRequest request(url);
	QNetworkReply* reply = NULL;
	request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");//application/json
	if (operation == QNetworkAccessManager::GetOperation) {
		reply = netAccessMgr_->get(request);
	}
	else if (operation == QNetworkAccessManager::PostOperation) {
		reply = netAccessMgr_->post(request, data);
	}
	if (sync) 
	{
		// 同步
		QEventLoop loop;
		connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
		loop.exec();
		if (reply->error() == QNetworkReply::NoError) {
			QString strReply = (QString)reply->readAll();
			QJsonParseError jsonError;
			QJsonDocument jsonDocument = QJsonDocument::fromJson(strReply.toUtf8(), &jsonError);
			if (jsonError.error == QJsonParseError::NoError) {
				return jsonDocument;
			}
		}
	}
	return QJsonDocument();
}
//   设置请求头的方式   使用get
QByteArray NetworkManager::getUrl(QString url, QByteArray data,int type)
{
	QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
	QNetworkRequest requestInfo;
	requestInfo.setUrl(QUrl(url));
	requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
	requestInfo.setRawHeader(QByteArray("X-Subject-Token"), data);        //设置请求头
	QEventLoop eventLoop;
	QNetworkReply *reply = m_pHttpMgr->get(requestInfo);;
	connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
	eventLoop.exec();
	//错误处理
	if (reply->error() == QNetworkReply::NoError)
	{
		qDebug() << "request protobufHttp NoError";
	}
	else
	{
		QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
	}
	//请求返回的结果
	QByteArray responseByte = reply->readAll();
	return responseByte;
}
//设置请求头和请求内容的方式。使用put
void NetworkManager::keepAliveVideo(QString path, QByteArray data, QString token)
{
	QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
	//设置url
	QString url = path;
	//设置头信息
	QNetworkRequest requestInfo;
	requestInfo.setUrl(QUrl(url));
	requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
	requestInfo.setRawHeader(QByteArray("X-Subject-Token"), data);

	//发送数据
	QByteArray qByteHttpData;
	qByteHttpData.append(QString("{\"token\":  \"%1\"}").arg(token));
	QNetworkReply *reply = m_pHttpMgr->put(requestInfo, qByteHttpData);
	QEventLoop eventLoop;
	connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
	eventLoop.exec();      
	//请求收到的结果
	QByteArray responseByte = reply->readAll();
	QString strReply = (QString)reply->readAll();
	qWarning() << responseByte;
	qWarning() << strReply;
}


void NetworkManager::handleAsyncRequestFinished(QNetworkReply* reply) {
	if (reply->error() == QNetworkReply::NoError) {
		QString strReply = (QString)reply->readAll();
		QJsonParseError jsonError;
		QJsonDocument jsonDocument = QJsonDocument::fromJson(strReply.toUtf8(), &jsonError);
		if (jsonError.error == QJsonParseError::NoError) {
			emit queryServerSuccessed(reply->url().path(), jsonDocument);
		}
	}
	else {
		//Failed;
	}
}

.h文件

/**
 *
 * @brief	Declares the network manager class
 */

#ifndef NETWORK_MANAGER_H
#define NETWORK_MANAGER_H

#include <memory>
#include <mutex>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QJsonDocument>
#include <QJsonParseError>

// 线程安全的单例类(懒汉模式)
// 目前支持HTTP协议的GET, POST, 同步, 异步, 返回JSON格式数据
class NetworkManager : public QObject {
	Q_OBJECT

public:
	static std::shared_ptr<NetworkManager> getSingletonPtr();
	NetworkManager(const NetworkManager&) = delete;
	NetworkManager& operator=(const NetworkManager&) = delete;

	void fetchServerData(QString path, QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, QByteArray data = NULL, bool sync = true);
	QJsonDocument receiveHttpData(QString path, QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, QByteArray data = NULL, bool sync = true);
	QByteArray getUrl(QString path, QByteArray data, int type);
	void keepAliveVideo(QString path, QByteArray data,QString token);
signals:
	void queryServerSuccessed(QString path, QJsonDocument& jsonDocument);
	void errorServerSuccessed(QString path, QJsonDocument& jsonDocument);
	void hmjqueryServerSuccessed(QString path, QJsonDocument& jsonDocument);
	void hmjerrorServerSuccessed(QString path, QJsonDocument& jsonDocument);
	void dataAboveServerSuccessed(QString path,QJsonDocument& jsonDocument);
	void dataAboveServererror(QString path, QJsonDocument& jsonDocument);
private:
	explicit NetworkManager(QObject* parent = 0);
	~NetworkManager();
private slots:
	void handleAsyncRequestFinished(QNetworkReply* reply);
	
private:
	static std::shared_ptr<NetworkManager> _instPtr;
	static std::mutex mutex_;
	std::shared_ptr<QNetworkAccessManager> netAccessMgr_;
	QNetworkAccessManager* netAccessMgr_tt;
};

#endif // !NETWORK_MANAGER_H

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用JSMpeg.js播放大华摄像头RTSP视频,您可以按照以下步骤进行操作: 1. 从大华摄像头获取RTSP视频的URL。例如,如果您的大华摄像头IP地址为192.168.1.100,RTSP端口为554,通道号为1,则RTSP视频的URL为:rtsp://192.168.1.100:554/cam/realmonitor?channel=1&subtype=0 2. 在HTML文件中引入JSMpeg.js脚本: ```html <script src="jsmpeg.min.js"></script> ``` 3. 在HTML文件中创建一个Canvas元素,用于显示视频: ```html <canvas id="videoCanvas"></canvas> ``` 4. 在JavaScript中创建一个JSMpeg.Player对象,并将Canvas元素和RTSP视频的URL作为参数传入: ```javascript var canvas = document.getElementById('videoCanvas'); var url = 'rtsp://192.168.1.100:554/cam/realmonitor?channel=1&subtype=0'; var player = new JSMpeg.Player(url, {canvas: canvas}); ``` 5. 调用player.play()方法开始播放视频。 完整的HTML文件示例代码如下: ```html <!doctype html> <html> <head> <title>播放大华摄像头RTSP视频</title> <script src="jsmpeg.min.js"></script> </head> <body> <canvas id="videoCanvas"></canvas> <script> var canvas = document.getElementById('videoCanvas'); var url = 'rtsp://192.168.1.100:554/cam/realmonitor?channel=1&subtype=0'; var player = new JSMpeg.Player(url, {canvas: canvas}); player.play(); </script> </body> </html> ``` 注意:由于浏览器安全策略的限制,JSMpeg.js无法直接从本地文件系统中加载视频,您需要将HTML文件部署到Web服务器上才能播放RTSP视频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值