我的程序是通过opencv读取视频,然后进行图片处理,之后输出到前端界面。在这个过程中我想使用socket将处理后的图片发送到局域网内的其他电脑。但是只能发送一帧。我的本机作为服务器端,另一台电脑作为接收端。我想在不影响我当前程序的运作下,能把图片也发出去。但是现在我写的socket是阻塞的,必须接受信号才能运作,运行也只能运行一次 就卡死。如何修改可以一边不影响我的程序,一边还能发信息。
class VideoStreamingTest(object):
def __init__(self,img,id,a):
self.connection, self.client_address=a[id].accept()
self.connect = self.connection.makefile('wb') # 创建一个传输文件 写功能 写入数据时b''二进制类型数据
self.host_name = socket.gethostname()
self.img=img # 获得服务端主机名
self.host_ip = socket.gethostbyname(self.host_name) # 获得服务端主机IP地址
time.sleep(3)
self.start()
def start(self):
print("客服端已连接:")
print("Client Host Name:", self.host_name)
print("Connection from: ", self.client_address)
print("Streaming...")
stream = io.BytesIO() # 创建一个io流,用于存放二进制数据
try:
frame=self.img
img_encode = cv2.imencode('.jpg', frame)[1] # 编码
data_encode = np.array(img_encode) # 将编码数据转换成二进制数据
stream.write(data_encode) # 将二进制数据存放到io流
self.connect.write(struct.pack('<L', stream.tell())) # struct.pack()将数据转换成什么格式 stream.tell()获得目前指针的位置,将数据写入io流后,数据指针跟着后移, # 也就是将数据长度转换成'<L'类型(无符号长整型),写入makefile传输文件 # 它的作用相当于 帧头数据,单独收到这个数据表示开始传输一帧图片数据,因为图片大小确定,这个数也就定下不变
self.connect.flush() # 刷新,将数据长度发送出去
stream.seek(0) # 更新io流,将指针指向0
self.connect.write(stream.read()) # 指针指向0后,从头开始读数据,然后写到makefile传输文件
stream.seek(0) # 更新指针
stream.truncate() # 更新io流数据,删除指针后面的数据
# 发送0,相当于帧尾数据,单独收到这个数表示一帧图片传输结束
except:
print(" ")
print("The customer service is disconnected!")
self.connect.write(struct.pack('<L', 0))
#self.connection.close()
print("与客服端断开连接!")
print(" ")
这是我在网上找的传输代码 但是我不知道怎么停止,让这个函数可以传输出去 就运行我程序的下一步。我把上面的函数添加到我处理完图像的函数之后,在要发到前端界面之前的位置。但是他会在socket停住,每次只能发送一张,等待我客户端运行一次 这边发一张。
self.is_draw = False
self.SaveNowVideo()
#self.send_look(img=self.img, id=self.id)
VideoStreamingTest(img=self.img,id=self.id,a=a)#这句就是上面的那段
self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB)
self.img_single.emit(self.img, self.id)