#include "VideoSocketService.h" #include "GetCameraDeviceID.h" #include "VideoProc.h" #include "json.hpp" VideoSocketService* VideoSocketService::getInstance() { static VideoSocketService _instance; return &_instance; } VideoSocketService::VideoSocketService() { } VideoSocketService::~VideoSocketService() { } void VideoSocketService::Start(uint16_t port) { static auto fun = [this](uint16_t port) { try { m_web_server.set_access_channels(websocketpp::log::alevel::none); m_web_server.clear_access_channels(websocketpp::log::alevel::none); m_web_server.init_asio(); m_web_server.set_open_handler(bind(&VideoSocketService::OnWebSocketOpen, this, &m_web_server, ::_1)); m_web_server.set_close_handler(bind(&VideoSocketService::OnWebSocketClose, this, &m_web_server, _1)); m_web_server.set_message_handler(bind(&VideoSocketService::OnWebSocketMessage, this, &m_web_server, _1, _2)); m_web_server.listen(port); m_web_server.start_accept(); m_web_server.run(); } catch (websocketpp::exception const& e) { std::cout << e.what() << std::endl; } catch (const std::exception & e) { std::cout << e.what() << std::endl; } catch (...) { std::cout << "未知异常" << std::endl; } }; std::thread(fun, port).detach(); std::thread(&VideoSocketService::PushImageThread, this).detach(); } void VideoSocketService::Stop() { m_web_server.stop(); } void VideoSocketService::OnWebSocketOpen(websocketsvr *server, websocketpp::connection_hdl hdl) { m_hdl = hdl; std::cout << "New Connection" << std::endl; } void VideoSocketService::OnWebSocketClose(websocketsvr *server, websocketpp::connection_hdl hdl) { std::cout << "OnWebSocketClose" << std::endl; // if (m_connection == hdl.lock().get()) // { // m_connection = nullptr; // } //OnClose(); } void VideoSocketService::OnWebSocketMessage(websocketsvr *server, websocketpp::connection_hdl hdl, message_ptr msg) { } void VideoSocketService::PushImg(std::string img) { std::lock_guard lock(m_mt); if (m_img_list.size() > 30) { m_img_list.pop(); } m_img_list.push(img); } void VideoSocketService::PushImageThread() { while (true) { if (m_img_list.size() > 0) { std::string ret = std::string("data:image/bmp;base64,") + m_img_list.front(); m_web_server.send(m_hdl.lock(), ret, websocketpp::frame::opcode::TEXT); { std::lock_guard lock(m_mt); m_img_list.pop(); } } else { std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } }