获取摄像头数据的方法

方法有几种
1 rtsp 获取后转发到外网
2 直接配置大华摄像头发送到外网

第一种方法有缺陷,不直接,需要转发服务,但是一种比较可靠的方法,如果网络中不能直接发出去,只能通过转发服务,那可以使用最为通用的方案,就是rtsp拉取后直接转发送到外网。

第二种方法使用要必须内网直接访问到外网,也就是摄像头可以直接连接到外网。
我们使用第二种方法,大华里面有一个配置是可以直接配置一个IP地址和端口,使用tcp方式直接推到外网的,不过,缺点就是,你得使用大华的sdk去接收,这样工作量少。

程序下载在此

建立数据结构推到外网

#pragma once
#include <mutex>
#include <string>
#include <map>
#include <set>
#include <list>
#include "websocketpp_server.h"
#include "dhnetsdk.h"
#include "dhplay.h"
#include "../RTMPPusher/H264AACRtmp.h"
#include "../RTMPPusher/TPacket.h"
#include "..\RecordAudio\audioRecord.h"
#include "web_send.h"
#pragma comment( lib, "dhnetsdk.lib")
#pragma comment( lib, "dhplay.lib")
using namespace std;typedef struct tagDH_DEVICE_INFO
{string             szDevSerial;string             szDevName;string             videofile_name;string             szIP;int                nPort;string             szUseName;string             szPassWord;int                nLoginType;                // 0:IP登录1:主动注册登录int                nLoginStatus;            // 设备状态,0:离线 1:排队登录 2:在线 3:停止预览  4 :当前设备正在播放中 5:注册失败 等待下次注册int                nLoginTimes;             // 尝试登录次数long long          lLoginID;                // 登录句柄long long          lRealHandle;              //播放句柄baseinfo * baseserver = NULL;con_list          connections;                //摄像头连接链表uint32_t           frist_timestamp=0;uint32_t         current_timestamp=0;LONG              lRealPort ;               //设备的播放库port号   一个设备一个 不能重复//H264AACRtmp           hr;                     //推送给RTMP的连接对象TQPacket      *packet=NULL;telemetry_client   web_client;//视频发送通道string   audio_url="";string  video_url = "";telemetry_client send_aac;//发送音频通道audioRecord gater_aac;//录音对象
}DH_DEVICE_INFO;typedef struct tagNODE_SESSION
{baseinfo * baseserver = NULL;con_list   connections;long long  heartTime = 0;}NODE_SESSION;class devClass
{private:devClass();//node_list m_node_list;
public://set<NODE_SESSION*> m_node_connect;baseinfo * pWServer = NULL;~devClass();static devClass* GetInstance();mutex mut; map<string, DH_DEVICE_INFO *> mymap;//map<connection_hdl, NODE_SESSION *> _node_map;list<NODE_SESSION *> node_list;map<string, NODE_SESSION *> node_map;//map<char *, string> clientHdl_map;void setBaseServer(baseinfo * info);baseinfo * getBaseServer();void addDevSession(string dev_serial, string username, string pass){std::lock_guard<std::mutex> guard(mut);DH_DEVICE_INFO * pinfo = NULL;auto map = mymap.find(dev_serial); //通过key确认设备是否注册if (map != mymap.end()) {//不等于end说明设备已经注册pinfo = map->second;//将设备信息给pinfo}if (pinfo != NULL) {//更新mymap中key对应的设备信息pinfo->baseserver = pWServer;//pinfo->szDevSerial = dev_serial;pinfo->szUseName = username;pinfo->szPassWord = pass;OUTINFO_3_PARAM("set  info repate  success   id = %s , username = %s ,pwd = %s   \n", dev_serial.c_str(),username.c_str(),pass.c_str());}else {DH_DEVICE_INFO * pinfo = new DH_DEVICE_INFO();pinfo->baseserver = pWServer;pinfo->nLoginStatus = 0;pinfo->szDevSerial = dev_serial;pinfo->szUseName = username;pinfo->szPassWord = pass;mymap[dev_serial] = pinfo;OUTINFO_3_PARAM("set  info   scuuess   id = %s , username = %s ,pwd = %s   \n", dev_serial.c_str(), username.c_str(), pass.c_str());}}int addDevSession(string dev_serial, connection_hdl hd) {std::lock_guard<std::mutex> guard(mut);//char * p = (char*)&hd;auto  iter = mymap.find(dev_serial);if (iter != mymap.end()) {DH_DEVICE_INFO * pinfo = iter->second;pinfo->connections.insert(hd);int size = pinfo->connections.size();OUTINFO_1_PARAM("set  connections  scuuess    size = %d  \n", size);return 0;}OUTINFO_0_PARAM("set  connections   error = no this dev   \n");return -1;}void addNodeSession(string key, connection_hdl hd) {OUTINFO_0_PARAM("BEGIN addNodeSession\n");std::lock_guard<std::mutex> guard(mut);NODE_SESSION * pnode = new NODE_SESSION();pnode->connections.clear();pnode->connections.insert(hd);pnode->baseserver = pWServer;//pnode->connections.clear();node_map[key] = pnode;int size = pnode->connections.size();OUTINFO_1_PARAM("set   node_hdl=%s   scuuess\n", key.c_str());OUTINFO_1_PARAM("this nodeconnect  size = %d   \n" , size );OUTINFO_0_PARAM("END addNodeSession\n");}void addNodeSessionHeartTIme(string key, connection_hdl hd, long long heartTime) {OUTINFO_0_PARAM("BEGIN addNodeSession\n");std::lock_guard<std::mutex> guard(mut);auto iter = node_list.begin();int size;while (iter != node_list.end()){NODE_SESSION * pnode = *iter;con_list &set = pnode->connections;if (set.find(hd) != set.end()) {//找到当前句柄size = node_list.size();OUTINFO_0_PARAM("have been addNodeSession\n");OUTINFO_1_PARAM("this nodeconnect  size = %d   \n", size);OUTINFO_0_PARAM("END addNodeSession\n");return;}iter++;}NODE_SESSION * pnode = new NODE_SESSION();pnode->connections.insert(hd);pnode->baseserver = pWServer;pnode->heartTime = heartTime;node_list.push_back(pnode);size = node_list.size();OUTINFO_1_PARAM("set   node_hdl=%s   scuuess\n", key.c_str());OUTINFO_1_PARAM("this nodeconnect  size = %d   \n", size);OUTINFO_0_PARAM("END addNodeSession\n");}int removehd(string key, connection_hdl hd) {std::lock_guard<std::mutex> guard(mut);auto map = mymap.find(key);DH_DEVICE_INFO * pinfo = NULL;if (map != mymap.end()){pinfo = map->second;pinfo->connections.erase(hd);int size = pinfo->connections.size();OUTINFO_1_PARAM("  connect size = %d  \n", size);}if (pinfo != NULL && pinfo->nLoginStatus ==4 &&  pinfo->connections.size() == 0) {OUTINFO_0_PARAM("  stop playing  \n");//当前没有浏览器请求流devClass * pdevClass = devClass::GetInstance();//  根据当前播放的 句柄断开连接  //关闭预览//关闭预览//启动一个线程关闭播放 不影响webscoket 通信stopPlay(pinfo);//注销用户//CLIENT_Logout(pinfo->lLoginID);}return 0;}void stopPlay(DH_DEVICE_INFO * pinfo);int set(string key, const char *pIp, WORD wPort, int status,LONG lRealPort);void setheartTime(connection_hdl hdl,long long heartTime) {auto iter = node_list.begin();while (iter != node_list.end()){NODE_SESSION * pnode = *iter;con_list &set = pnode->connections;if (set.find(hdl) != set.end()) {//找到当前句柄pnode->heartTime = heartTime;OUTINFO_1_PARAM("set heart  time = %lld \n", heartTime);break;}iter++;}}int setlLoginID(string key, long long lLoginID){std::lock_guard<std::mutex> guard(mut);DH_DEVICE_INFO * pinfo = NULL;auto map = mymap.find(key);if (map != mymap.end() ) {pinfo = map->second;}if (pinfo != NULL){pinfo->lLoginID = lLoginID;}else {return -1;}return 0;};int  setlRealHandle(string key, long long lRealHandle) {OUTINFO_0_PARAM(" BEGIN  setlRealHandle  \n");std::lock_guard<std::mutex> guard(mut);auto map = mymap.find(key);DH_DEVICE_INFO * pinfo = NULL;if (map != mymap.end()) {pinfo = map->second;}if (pinfo != NULL){pinfo->lRealHandle = lRealHandle;OUTINFO_1_PARAM(" END  setlRealHandle    handeleid = %lld \n"  , lRealHandle);return 0;}else {OUTINFO_0_PARAM(" END   setlRealHandle   error = -1  \n");return -1;}}int setLoginStatus(string key, int status);int getLoginStatus(string key);int  getDevSession(string key, DH_DEVICE_INFO  * dhInfo);void delDevSession(string key);void Send(char * p, int len, string key) {std::lock_guard<std::mutex> guard(mut);try {DH_DEVICE_INFO * pinfo = NULL;auto map = mymap.find(key);if (map != mymap.end()){pinfo = map->second;con_list  &set = pinfo->connections;con_list::iterator it;for (it = set.begin(); it != set.end(); ++it) {pinfo->baseserver->SendFrame(*it, p, len);}}}catch (string const & e) {OUTINFO_1_PARAM("Send   error = %s \n", e.c_str());}}void Send(void * devSerial, int status) {OUTINFO_0_PARAM("BEGIN SEND_DEV_STA\n");std::lock_guard<std::mutex> guard(mut);try {auto iter = node_list.begin();while (iter != node_list.end()){NODE_SESSION * pnode = *iter;if (pnode != NULL) {con_list  &set = pnode->connections;con_list::iterator it;for (it = set.begin(); it != set.end(); ++it) {pnode->baseserver->SendFrame(*it, devSerial, status);}}iter++;}}catch (string const & e) {//std::cout << e.c_str() << std::endl;OUTINFO_1_PARAM("SEND_DEV_STA   error = %s  \n", e.c_str());}OUTINFO_0_PARAM("END SEND_DEV_STA\n");}void Send(string devSerial,string pic_name) {std::lock_guard<std::mutex> guard(mut);try {auto iter = node_list.begin();while (iter != node_list.end()){NODE_SESSION * pnode = *iter;if (pnode != NULL) {con_list  &set = pnode->connections;con_list::iterator it;for (it = set.begin(); it != set.end(); ++it) {pnode->baseserver->SendFrame(*it, devSerial, pic_name);}}iter++;}}catch (string const & e) {OUTINFO_1_PARAM("SEND_DEV_STA   error = %s  \n", e.c_str());}}void delete_mem(){//lock//map<string, DH_DEVICE_INFO *> mymap;//map<connection_hdl, NODE_SESSION *> _node_map;//list<NODE_SESSION *> node_map;{auto iter = mymap.begin();while (iter != mymap.end()){DH_DEVICE_INFO *item = iter->second;delete item;iter++;}}{auto iter1 = node_list.begin();while (iter1 != node_list.end()){NODE_SESSION * s = *iter1;delete s;iter1++;}}}};

建立websocket 服务

为了使得数据能够被浏览器访问,建立一个websocket服务,直接转发h264,也可以转发到rtmp server,两种方式都可以,程序里面有。主要程序如下所示


#define _CRT_SECURE_NO_WARNINGS
#include "websocketpp_server.h"
#include "devClass.h"
#include "dhServer.h"
broadcast_server::broadcast_server() {m_server.init_asio();m_server.set_open_handler(bind(&broadcast_server::on_open, this, std::placeholders::_1));m_server.set_close_handler(bind(&broadcast_server::on_close, this, std::placeholders::_1));m_server.set_message_handler(bind(&broadcast_server::on_message, this, std::placeholders::_1, std::placeholders::_2));
}void broadcast_server::run(uint16_t port) {m_server.listen(port);m_server.start_accept();try {OUTINFO_1_PARAM("***WS server Listen Success! port:%d ***\n", port);m_server.run();}catch (const std::exception & e) {OUTINFO_1_PARAM(" WS server Listen fail ! error:%s\n", e.what());}
}void broadcast_server::on_open(connection_hdl hdl) {//lock_guard<mutex> guard(m_action_lock);OUTINFO_0_PARAM(" WS server on_open \n" );//m_actions.push(action(SUBSCRIBE, hdl));//m_action_cond.notify_one();
}void broadcast_server::on_close(connection_hdl hdl) {//lock_guard<mutex> guard(m_action_lock);OUTINFO_0_PARAM(" WS server on_close \n");devClass * pdevclass = devClass::GetInstance();/*map<char *, string> clientHdl_map = pdevclass->clientHdl_map;string id = clientHdl_map[(char*)&hdl] ;*///string id = pdevclass->clientHdl_map[hdl] ;map<string, DH_DEVICE_INFO *>::iterator iter;iter = pdevclass->mymap.begin();for (; iter != pdevclass->mymap.end(); iter++) {DH_DEVICE_INFO * pinfo = iter->second;string id = iter->first;if (pinfo !=NULL){con_list &set = pinfo->connections;if (set.find(hdl) != set.end()) {OUTINFO_1_PARAM("this disconnect  id = %s \n",id.c_str());pdevclass->removehd(id, hdl);}}}//m_actions.push(action(UNSUBSCRIBE, hdl));//m_action_cond.notify_one();
}
//通过该方法从web端获得摄像头的配置信息(链接句柄,配置信息)
void broadcast_server::on_message(connection_hdl hdl, server::message_ptr msg) {devClass * pdevclass = devClass::GetInstance();OUTINFO_0_PARAM("BEGIN WS server on_message resove \n");string  tempstring = msg->get_payload();//安全判断if (tempstring == "undifined" || tempstring == "null"  || tempstring == "[object Object]") {OUTINFO_0_PARAM("WS server  recieve error = undifined OR null  \n");std::string msg_str = "{\"type\":\"999\",\"info\":\"Bad Request,parameter error;\",\"code\":\"0\"}";sendText(hdl, msg_str);return;}string type = m_type_number(tempstring);if (type == "0") {OUTINFO_1_PARAM("recieve node msg : %s \n", tempstring.c_str());pdevclass->addNodeSessionHeartTIme("node", hdl, getMilliTime());//给当前变量全局 ms 数进行赋值std::string msg_str = "{\"type\":\"0\",\"info\":\"u are node_client\"}";sendText(hdl, msg_str);}else if (type == "1"  || type == "2") //添加设备信息{device one_device = m_init_device_list(tempstring);list<device_init_add>::iterator it;list<device_init_add>  list = one_device.dev_list;it = list.begin();while (it != list.end()){pdevclass->addDevSession(it->dev_serial, it->user_name, it->passwd);it++;}}
//++++++++++++++++++++直播代码段++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++else if(type == "4")  {OUTINFO_1_PARAM("recieve node msg : %s \n", tempstring.c_str());//printf("recieve node msg : %s \n", tempstring.c_str());string dev_serial = m_live_broadcast(tempstring);//浏览器将想要获得的摄像头的唯一序列号通过websocketpp(js_sion)传给服务器//类似于申请获取那个摄像头的流string type = m_video_type(tempstring);//要获取的视频流类型if (dev_serial.empty())//没有连接到摄像头{OUTINFO_0_PARAM(" dev_serial = nullstr  \n");printf("dev_serial=nullstr");std::string msg_str = "{\"type\":\"4\",\"info\":\"Bad Request,parameter error; \",\"code\":\"0\"}";sendText(hdl, msg_str);return;}//将当前请求直播的 hd ———— id 存入到map 中//将当前请求直播的连接保存到connections属性中int ret = pdevclass->addDevSession(dev_serial,hdl);if (ret == -1) {//返回-1说明连接没有成功,没有找到设备std::string msg_str = "{\"type\":\"4\",\"info\":\"Not Found This Dev;\",\"code\":\"1\"}";sendText(hdl, msg_str);}else{//获得摄像头的状态// 设备状态,0:离线 1:排队登录 2:在线 3:停止预览  4 :当前设备正在播放中 5:注册失败 等待下次注册int loginStatus = pdevclass->getLoginStatus(dev_serial);if(loginStatus == -1){std::string msg_str = "{\"type\":\"4\",\"info\":\"This Dev Offline\",\"code\":\"2\"}";sendText(hdl,msg_str);}else{//开启获取设备的线程std::string msg_str = "{\"type\":\"4\",\"info\":\"Play It Right Now\",\"code\":\"3\"}";sendText(hdl, msg_str);dhServer dhserver;dhserver.thread_getH264ById(dev_serial,type);}}}else if (type == "8")  //截图{ OUTINFO_1_PARAM("recieve node msg : %s \n", tempstring.c_str());device_take_pic  pics = m_device_take_pic(tempstring);string dev_serial = pics.dev_serial;string pic_name = pics.pic_name;dhServer dhserver;dhserver.thread_getpicture(dev_serial, pic_name);}else if (type == "10")  //get cam isonline {OUTINFO_1_PARAM("recieve node msg : %s \n", tempstring.c_str());char body [128] = "";std::string head = "{\"type\":\"10\",\"info\":{";device one_device = m_init_device_list(tempstring);list<device_init_add>::iterator it;list<device_init_add>  list = one_device.dev_list;it = list.begin();while (it != list.end()){int status =  pdevclass->getLoginStatus(it->dev_serial);_snprintf(body, sizeof(body) - 1, " \"%s\":{\"deviceid\":\"%s\" ,\"status\":\"%d\"} ,", it->dev_serial.c_str(), it->dev_serial.c_str(), status);string body1 = body;head +=  body1;*it++;}head.pop_back();head = head + "}}";sendText(hdl, head);}else if (type == "11")  //接受node 心跳{OUTINFO_1_PARAM("recieve node msg : %s \n", tempstring.c_str());//给当前变量全局 ms 数进行赋值std::string msg_str = "{\"type\":\"11\",\"info\":\"heart beatting\"}";sendText(hdl, msg_str);//设置当前连接的心跳pdevclass->setheartTime(hdl, getMilliTime());/*function<void(error_code const &)> sfunc = std::bind(&broadcast_server::timer_callback, this, std::placeholders::_1);m_server.set_timer(time, sfunc);*/}OUTINFO_0_PARAM("END WS server on_message resove\n");
}void broadcast_server::timer_callback(error_code const &error) {// printf("this is a test\n\n");
}string broadcast_server::m_type_number(string json_string) {std::stringstream str_stream(json_string);boost::property_tree::ptree root;boost::property_tree::read_json(str_stream, root);//boost::property_tree::ptree::iterator root_it = root.BEGIN();string type = root.get<string>("type");return type;}device broadcast_server::m_init_device_list(string json_string) {device one_device;try{std::stringstream str_stream(json_string);boost::property_tree::ptree root;boost::property_tree::read_json(str_stream, root);boost::property_tree::ptree::iterator root_it = root.begin();for (; root_it != root.end(); ++root_it){string key = root_it->first;if ("type" == key){one_device.type = root.get<string>(key);}if ("info" == key){boost::property_tree::ptree info_node = root.get_child(key);boost::property_tree::ptree list_node = info_node.get_child("list");boost::property_tree::ptree::iterator list_node_it = list_node.begin();for (; list_node_it != list_node.end(); ++list_node_it){device_init_add one_init_add;boost::property_tree::ptree tkt = list_node_it->second;boost::property_tree::ptree::iterator tkt_it = tkt.begin();for (; tkt_it != tkt.end(); ++tkt_it){string tkt_key = tkt_it->first;string tkt_val = tkt.get<string>(tkt_key);if (tkt_key == "deviceid")one_init_add.dev_serial = tkt_val;else if (tkt_key == "username")one_init_add.user_name = tkt_val;else if (tkt_key == "password")one_init_add.passwd = tkt_val;//   cout << tkt_key << ":" << tkt_val << endl;}/*struct device{string type;std::list<device_init_add> dev_list;};*/one_device.dev_list.push_back(one_init_add);//push设备的deviceid、usename、password 到list中}}else{/*string val = root.get<string>(key);cout << key << ":" << val << endl;*/}}}catch (const std::exception& e){OUTINFO_1_PARAM("m_init_device_list   error = %s  \n", e.what());}return one_device;}//获取操作的deviceid
string  broadcast_server::m_live_broadcast(string json_string ){string  device_s;try{std::stringstream str_stream(json_string);boost::property_tree::ptree root;boost::property_tree::read_json(str_stream, root);boost::property_tree::ptree info_node = root.get_child("info");device_s = info_node.get<string>("deviceid");}catch (const std::exception& e){OUTINFO_1_PARAM("m_live_broadcast   error = %s  \n", e.what());}return device_s;}//获取device传输码流的类型
string  broadcast_server::m_video_type(string json_string)
{string  type;try{std::stringstream str_stream(json_string);boost::property_tree::ptree root;boost::property_tree::read_json(str_stream, root);boost::property_tree::ptree info_node = root.get_child("info");type = info_node.get<string>("video_type");//printf(">>>>>video_type:%s<<<<<",type.c_str());}catch (const std::exception& e){OUTINFO_1_PARAM("m_video_type   error = %s  \n", e.what());}return type;
}//获取截图的 摄像头 序列号 和 截取图片的name
device_take_pic  broadcast_server::m_device_take_pic(string json_string)
{device_take_pic  takes;try{std::stringstream str_stream(json_string);boost::property_tree::ptree root;boost::property_tree::read_json(str_stream, root);boost::property_tree::ptree info_node = root.get_child("info");takes.dev_serial = info_node.get<string>("deviceid");takes.pic_name = info_node.get<string>("time");}catch (const std::exception& e){OUTINFO_1_PARAM("m_device_take_pic   error = %s  \n", e.what());}return takes;
}
//{"type":8, "info" : {"bim_id":"123456", "deviceid" : "3CEF8CFC7990", "time" : ""}}
//{"type":4, "info" : {"bim_id":"123456", "deviceid": "3CEF8CFC7990"}}
//void  broadcast_server::process_messages() {//
//  while (1) {//
//
//      unique_lock<mutex> lock(m_action_lock);
//
//
//      while (m_actions.empty()) {//          m_action_cond.wait(lock);
//      }
//
//
//      action a = m_actions.front();
//
//
//      m_actions.pop();
//
//      lock.unlock();
//
//
//
//
//          if (a.type == SUBSCRIBE) {//              lock_guard<mutex> guard(m_connection_lock);
//              m_connections.insert(a.hdl);
//              devClass * pdevClass = devClass::GetInstance();
//              string key = "3CEF8CFC7990";
//              string username = "admin";
//              string pass = "ma11111111";
//              pdevClass->addDevSession(key, username, pass);
//
//          }
//          else if (a.type == UNSUBSCRIBE) {//              lock_guard<mutex> guard(m_connection_lock);
//              printf("当前设备断开连接。。。。。。。。。。。。。。。。。。。。。。。。。");
//              m_connections.erase(a.hdl);
//          }
//          else if (a.type == MESSAGE) {//              lock_guard<mutex> guard(m_connection_lock);
//
//              devClass * pdevClass = devClass::GetInstance();
//              pdevClass->addDevSession("3CEF8CFC7990", a.hdl);
//              dhServer dhserver;
//              dhserver.thread_getH264ById("3CEF8CFC7990");
//              //摄像头的信息在a.msg里面,组建结构,写到map里面去
//              /*string payload = a.msg->get_payload();
//              string DevSerial = analysePayload(payload);*/
//
//
//              //con_list::iterator it;
//              /*for (it = m_connections.begin(); it != m_connections.end(); ++it) {//                  m_server.send(*it, a.msg);
//              }*/
//          }
//      }
//      else {//          // undefined.
//      }
//
//  }
//}void broadcast_server::SendFrame(connection_hdl hd, char * p, int len)
{try {//将数据以二进制的形式发出去m_server.send(hd, p, len, websocketpp::frame::opcode::binary);}catch (websocketpp::exception const & e) {OUTINFO_1_PARAM("SendFrame_video   error = %s  \n", e.what());}
}void broadcast_server::SendFrame(connection_hdl hd, void * devSerial, int status)
{try {string strSerial = (char*)devSerial;char body[128]  = "";_snprintf(body, sizeof(body) - 1, "{ \"type\":\"0\",\"info\":{ \"deviceid\":\"%s\" ,\"status\":\"%d\"}}", strSerial.c_str(), status);sendText(hd, (string)body);}catch (websocketpp::exception const & e) {OUTINFO_1_PARAM("SendFrame_sendText   error = %s  \n", e.what());}
}void broadcast_server::SendFrame(connection_hdl hd,string devSerial,string pic_name)
{try {/*    string id_name = (char*)devSerial;int flag = id_name.find("#");string id = id_name.substr(0, flag);string pic_name = id_name.substr(++flag, -1);*/char body[128] = "";_snprintf(body, sizeof(body) - 1, "{ \"type\":\"8\",\"info\":{ \"deviceid\":\"%s\",\"pic_name\":\"%s\"}}", devSerial.c_str(), pic_name.c_str());sendText(hd, (string)body);/* char * p = (char *)devSerial;delete[]p;*/}catch (websocketpp::exception const & e) {OUTINFO_1_PARAM("SendFrame_pic   error = %s  \n", e.what());}
}void broadcast_server::CloseConnect(connection_hdl hd)
{try {m_server.close(hd,0,"heartbeat close");OUTINFO_0_PARAM("close connect ,becauser no recieve data...\n");}catch (websocketpp::exception const & e) {OUTINFO_1_PARAM("CloseConnect   error = %s  \n", e.what());}}int broadcast_server::GetUserNumberByDevName(const char * devname)
{return 0;
}long long broadcast_server::getMilliTime()
{ struct timeb t1;ftime(&t1);return t1.time * 1000 + t1.millitm;
}void broadcast_server::sendText(connection_hdl hdl,string & msg) {OUTINFO_1_PARAM(" BEGIN sendText  msg = %s\n" , msg.c_str());try {int len = msg.size();server::message_ptr m;char *p = (char *)msg.c_str();m_server.send(hdl, p, len, websocketpp::frame::opcode::text);}catch (websocketpp::exception const & e){OUTINFO_1_PARAM(" sendText   error = %s  \n", e.what());}}

接收程序

html端使用h264 js解码,直接播放,这样的好处是可以让手机端使用html5也直接播放,当然,可以使用原生的程序直接播放,就可以避免一些限制。下面使用html5 解码,使用的decoder.js 等为开源程序,缺陷,只能解码baseline 的h264,各位要解码h264 和h265 请使用wasm的程序,网上有很多。

<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=320, initial-scale=1" /><title>h264 streaming</title><style type="text/css">body {background: #333;text-align: center;margin-top: 10%;}#videoCanvas {/* Always stretch the canvas to 640x480, regardless of itsinternal size. */width: 640px;height: 480px;}</style>
</head>
<body><!-- The Canvas size specified here is the "initial" internal resolution. jsmpeg willchange this internal resolution to whatever the source provides. The size thecanvas is displayed on the website is dictated by the CSS style.--><!--<canvas id="videoCanvas" width="640" height="480"><p>Please use a browser that supports the Canvas Element, like<a href="http://www.google.com/chrome">Chrome</a>,<a href="http://www.mozilla.com/firefox/">Firefox</a>,<a href="http://www.apple.com/safari/">Safari</a> or Internet Explorer 10</p></canvas>--><script type="text/javascript" src="Decoder.js"></script><script type="text/javascript" src="YUVCanvas.js"></script><script type="text/javascript" src="Player.js"></script><script type="text/javascript">var player = new Player({size: {width: 640,height: 320}});document.body.appendChild(player.canvas);//var strhost = "ws://" + window.location.host ;var strhost = "ws://192.168.3.245:9002" ;// Setup the WebSocket connection and start the playervar client = new WebSocket( strhost );client.binaryType = 'arraybuffer';client.onopen = function(evt) {onOpen(evt)};client.onclose = function(evt) {onClose(evt)};client.onmessage = function(evt) {onMessage(evt)};client.onerror = function(evt) {onError(evt)};function onOpen(evt) {//  document.getElementById('messages').innerHTML = 'Connection established';console.log("connection ");//  alert("open");}function onClose(evt) {alert("close");}function onMessage(evt) {//console.log(evt.data);//return;var messageData = new Uint8Array(evt.data);player.decode(messageData);}function onError(evt) {alert("error");}</script>
</body>
</html>

大华摄像头使用外网接收数据相关推荐

  1. 大华摄像头使用外网进行访问管理

    设置大华摄像头外网访问方式有两种情况: 一.摄像头直接和光猫连接不和路由器相连的情况 这种情况下只要登录大华摄像头的管理端然后利用大华摄像头自己的DDNS设置配置好域名后则可以进行访问 二.摄像头是连 ...

  2. WEB页面播放大华摄像头视频解决方案

    目前在网页上播放大华摄像头视频,有如下2种途径: 1)首选获取摄像头的hls协议地址,H5可直接播放 2)获取摄像头rtsp协议地址,用ffmpeg转换成hls再播放 近期做的一个项目,需要在WEB端 ...

  3. Qt获取大华摄像头监控画面(RTSP流方式)

    一.与摄像头建立连接 1.RTSP格式 //格式 rtsp://username:password@<address>:<port>/Streaming/Channels< ...

  4. java制作h5视频聊天_JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。...

    JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路. 2018-09-17 问题:大华IPC枪型摄像头需要在WEB中显示实时监控视频,官方提供的SDK只有C#的桌面程序访问方式. 解决 ...

  5. 大华摄像头java开发之抓图

    大华摄像头java开发之抓图 继上一个海康的项目之后,这个月开始了大华网络摄像头的二次开发,在写正式的内容之前先容我吐槽一下: 首先就是从官网下载的Demo,里面只有C写的,让我一个java开发怎么看 ...

  6. 大华摄像头网页端控制+web串口(适用任何浏览器,不能用来打我)通讯合集

    大华摄像头网页端控制+web串口(适用任何浏览器,不能用来打我)通讯合集 web界面操作图 实现原理 通过本地java web服务器开通websocket对服务进行支持,后调用大华java 通用 SD ...

  7. JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。

    问题:大华IPC枪型摄像头需要在WEB中显示实时监控视频,官方提供的SDK只有C#的桌面程序访问方式. 解决思路: RTSP协议访问方式将RTSP流转换成hls文件在H5的video播放器中进行播放实 ...

  8. 对接第三方《大华摄像头》

    首先是进入大华摄像头旗下的乐橙云官网https://open.imou.com/,把sdk下载后,开发文档里有前端和后端的开发对接. 前端 一般是轻应用开发(我用的老版轻应用,应该都差不多)有播放器代 ...

  9. 大华摄像头二次开发-web端实现实时视频监控

    最近客户提需要,需要在现有的系统中集成视频监控功能,摄像头是大华的.而大华又没有关于java的sdk,官网只能下载到c++的demo和dll文件.无奈只能自己在网上找了,最后找到了一些解决办法,把实现 ...

最新文章

  1. python pywinauto 单击鼠标_基于Python的学生信息管理系统
  2. Ember.js系列文章
  3. continue 的用户及实例
  4. [XSY] 字符串题(字符串,构造)
  5. HttpClient api-连接池
  6. Qt图形界面编程入门(标签与槽机制习题分享)
  7. 市面上有哪几种门_市面上常见的木门种类有哪些呢?
  8. 备份自己的myeclipse快捷键到需要的环境
  9. mysql5.6.24安装perl,linux下perl操作MySQL数据库(需要安装DBI)
  10. 计算机组成原理浮点数左移规则,2020考研计算机组成原理知识点:浮点数的表示和运算...
  11. sysmain服务怎么启动 Win7 SuperFetch无法启动
  12. Revit二次开发——视图
  13. Calander 类的使用
  14. 迭代法求一元三次方程
  15. Linux CentOS6和CentOS7设置静态ip
  16. 什么是MTD分区和NAND flash?
  17. 《LeetCode零基础指南》(第十一讲) 遇到不会的题怎么办?
  18. OSD的主要实现方法和类型
  19. 飞机大战的部分思路框架及其代码实现
  20. UglifyJS 合并 压缩 JS文件

热门文章

  1. 常用linux 命令 -网络相关
  2. python线性回归分析看相关性_机器学习入门:相关性分析之线性回归
  3. 公众号模板消息 跳转小程序报错invalid weapp pagepath解决方法
  4. 内网穿透工具-venom
  5. 清华大学五道口金融学院2022年博士生(联合培养项目)招生简章
  6. 模拟不同系统不同浏览器
  7. “技术让生活更便捷”之腾讯位置服务JavaScript API2.0前端定位和位置标注的开发实录
  8. 遇到”xxxx.app已损坏,打不开,解决方案
  9. 嵌入式学习资料和项目汇总
  10. A5SHB,A5SHB芯片三极管规格书