视频监管系统由三部分组成:
client-streamer(c ++) - > server(c ++) - >客户主管(浏览器/ js / websockets)
Streamer将jpeg帧从网络摄像头发送到服务器,服务器将此帧存储在此Streamer的std::string
缓冲区中(map<string, string>Streamers
- &gt; Streamers[ID].Camera
)。当主管查询某个代理的流时,服务器将编码的Streamers[ID].Camera
作为二进制发送给他(根据websocket standart)。结果图像在浏览器中闪烁!我认为服务器响应的是一个与代理的发布请求同时写入的帧,并且该帧正在发送给管理器被截断。这是一个截图:
https://github.com/twbs/bootstrap/issues/12799
如果断开客户端,服务器将把他的最后一帧发送给主管,最后一帧始终是满的。这意味着发送和接收没有问题。我几乎可以肯定问题在于同时访问两个线程中的一个变量。
所以我想在服务器上添加一些框架,然后再发送给主管。类似的东西:
while(!FrameIsFull(CameraFrame)){
Sleep(1);
}
SendAllData(Socket, websocket_encode(CameraFrame));
我应该做些什么bool FrameIsFull(string jpeg_frame)
;?
PS:FireFox也常常在控制台中写入“图像已损坏或被截断”并仅显示帧的一部分。它如何检查图像?