如何在UDP python中创建两个线程,一个用于发送视频,另一个用于同时接收视频
大家好,我正在制作一个 UDP 协议来在服务器和客户端之间创建实时聊天,我已经编写了一个代码,让服务器将视频发送到客户端,反之亦然,效果很好。但现在我正在尝试将其发送和接收同时我尝试对客户端和服务器使用两个线程,但似乎我收到了此错误
2022-03-27 04:51:48.211 python3[6961:9402560] 警告:nextEventMatchingMask 只能从主线程调用!这将来会抛出异常。
它不起作用图片
这是我的代码
server.py
import numpy as np
import cv2, imutils, socket
import time
import base64
import threading
BUFF_SIZE = 65536
message = b'Hello'
def create_UDP_Socket():
global server_socket
global host_ip
global host_name
global port
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
host_name = socket.gethostname()
print(host_name)
host_ip = socket.gethostbyname(host_name)
print(host_ip)
port = 9998
except socket.error as msg:
print(f'Create socket error : {msg}')
def binding_socket():
try:
socket_address = (host_ip, port)
server_socket.bind(socket_address)
print('listening at :-', socket_address)
except socket.error as msg:
print(f'Binding socket error : {msg}')
def broadcast():
print('Waiting for client to connect to broadcast')
while True:
vid = cv2.VideoCapture(0)
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
# receive request from user
msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
print('GOT connection from ', client_addr)
# Check user request
if msg == b'request broadcast':
print(f'Receveing request broadcasting from client{client_addr}')
print(f'Broadcast video to user :{client_addr}')
Width = 400
while vid.isOpened():
_,frame = vid.read()
frame = imutils.resize(frame, width=Width)
endcoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
message = base64.b64encode(buffer)
server_socket.sendto(message,client_addr)
# print(f'Sending to client : {client_addr}')
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow('Transmitting Video to Client (q:quit)',frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
server_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
else:
print(f'Client at address {client_addr} wrong request')
msg = b'wrong request'
server_socket.sendto(msg,client_addr)
break
def receive_broadcast():
# wating for client to send request
print('waiting for client to connect')
# receive connection from client
msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
print(f'Connect to : {client_addr}')
server_socket.sendto(message,client_addr)
print('Receciving a broadcast')
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
while True:
# receiving video fromm client
packet, _ = server_socket.recvfrom(BUFF_SIZE)
data = base64.b64decode(packet,b' /')
npdata = np.fromstring(data, dtype=np.uint8)
frame = cv2.imdecode(npdata, 1)
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow("RECEIVING VIDEO from Client (q:quit)", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
server_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
def start():
t1 = threading.Thread(target=broadcast)
t2 = threading.Thread(target=receive_broadcast)
t1.start()
t2.start()
create_UDP_Socket()
binding_socket()
start()
client.py
import cv2, imutils, socket
import numpy as np
import time
import base64
import threading
BUFF_SIZE = 65536
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
host_name = socket.gethostname()
host_ip = socket.gethostbyname(host_name)
print('Host ip: - ',host_ip)
port = 9998
def receive_broadcast():
#request to connect
message = b'request broadcast'
client_socket.sendto(message, (host_ip, port))
print('test: ',message)
print('Send Request to a server for Broadcast video')
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
while True:
packet, server_add = client_socket.recvfrom(BUFF_SIZE)
if packet == b'wrong request':
print('server reject ')
break
#print(f"connected to server:{server_add}")
data = base64.b64decode(packet,b' /')
npdata = np.fromstring(data, dtype=np.uint8)
frame = cv2.imdecode(npdata, 1)
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow("RECEIVING VIDEO from Server (q:quit)", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
client_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
def broadcast():
# request to connect
message = b'request to connect to server'
client_socket.sendto(message, (host_ip, port))
print('test: ',message)
print('Sending Broadcasting')
while True:
vid = cv2.VideoCapture(0)
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
msg, client_addr = client_socket.recvfrom(BUFF_SIZE)
print('GOT connection from ', client_addr)
Width = 400
while vid.isOpened():
_,frame = vid.read()
frame = imutils.resize(frame, width=Width)
endcoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
message = base64.b64encode(buffer)
client_socket.sendto(message,client_addr)
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow('Transmitting Video to Server (q:quit)',frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
client_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
def start():
t1 = threading.Thread(target=broadcast)
t2 = threading.Thread(target=receive_broadcast)
t1.start()
t2.start()
start()
Hi guy I am making a UDP protocol to create a live chat between server and client I have written a code for server to send video to client and vice versa which work fine.but right now I am trying to make it to sending and receiving at the same time I tried using two thread for both client and server but seems like I am getting this error
2022-03-27 04:51:48.211 python3[6961:9402560] WARNING: nextEventMatchingMask should only be called from the Main Thread! This will throw an exception in the future.
And it is not working image
here is my code
server.py
import numpy as np
import cv2, imutils, socket
import time
import base64
import threading
BUFF_SIZE = 65536
message = b'Hello'
def create_UDP_Socket():
global server_socket
global host_ip
global host_name
global port
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
host_name = socket.gethostname()
print(host_name)
host_ip = socket.gethostbyname(host_name)
print(host_ip)
port = 9998
except socket.error as msg:
print(f'Create socket error : {msg}')
def binding_socket():
try:
socket_address = (host_ip, port)
server_socket.bind(socket_address)
print('listening at :-', socket_address)
except socket.error as msg:
print(f'Binding socket error : {msg}')
def broadcast():
print('Waiting for client to connect to broadcast')
while True:
vid = cv2.VideoCapture(0)
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
# receive request from user
msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
print('GOT connection from ', client_addr)
# Check user request
if msg == b'request broadcast':
print(f'Receveing request broadcasting from client{client_addr}')
print(f'Broadcast video to user :{client_addr}')
Width = 400
while vid.isOpened():
_,frame = vid.read()
frame = imutils.resize(frame, width=Width)
endcoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
message = base64.b64encode(buffer)
server_socket.sendto(message,client_addr)
# print(f'Sending to client : {client_addr}')
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow('Transmitting Video to Client (q:quit)',frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
server_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
else:
print(f'Client at address {client_addr} wrong request')
msg = b'wrong request'
server_socket.sendto(msg,client_addr)
break
def receive_broadcast():
# wating for client to send request
print('waiting for client to connect')
# receive connection from client
msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
print(f'Connect to : {client_addr}')
server_socket.sendto(message,client_addr)
print('Receciving a broadcast')
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
while True:
# receiving video fromm client
packet, _ = server_socket.recvfrom(BUFF_SIZE)
data = base64.b64decode(packet,b' /')
npdata = np.fromstring(data, dtype=np.uint8)
frame = cv2.imdecode(npdata, 1)
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow("RECEIVING VIDEO from Client (q:quit)", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
server_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
def start():
t1 = threading.Thread(target=broadcast)
t2 = threading.Thread(target=receive_broadcast)
t1.start()
t2.start()
create_UDP_Socket()
binding_socket()
start()
client.py
import cv2, imutils, socket
import numpy as np
import time
import base64
import threading
BUFF_SIZE = 65536
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
host_name = socket.gethostname()
host_ip = socket.gethostbyname(host_name)
print('Host ip: - ',host_ip)
port = 9998
def receive_broadcast():
#request to connect
message = b'request broadcast'
client_socket.sendto(message, (host_ip, port))
print('test: ',message)
print('Send Request to a server for Broadcast video')
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
while True:
packet, server_add = client_socket.recvfrom(BUFF_SIZE)
if packet == b'wrong request':
print('server reject ')
break
#print(f"connected to server:{server_add}")
data = base64.b64decode(packet,b' /')
npdata = np.fromstring(data, dtype=np.uint8)
frame = cv2.imdecode(npdata, 1)
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow("RECEIVING VIDEO from Server (q:quit)", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
client_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
def broadcast():
# request to connect
message = b'request to connect to server'
client_socket.sendto(message, (host_ip, port))
print('test: ',message)
print('Sending Broadcasting')
while True:
vid = cv2.VideoCapture(0)
fps, st, frames_to_count, cnt = (0, 0, 20, 0)
msg, client_addr = client_socket.recvfrom(BUFF_SIZE)
print('GOT connection from ', client_addr)
Width = 400
while vid.isOpened():
_,frame = vid.read()
frame = imutils.resize(frame, width=Width)
endcoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
message = base64.b64encode(buffer)
client_socket.sendto(message,client_addr)
frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow('Transmitting Video to Server (q:quit)',frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
client_socket.close()
break
if cnt == frames_to_count:
try:
fps = round(frames_to_count/(time.time()-st))
st=time.time()
cnt=0
except:
pass
cnt+=1
def start():
t1 = threading.Thread(target=broadcast)
t2 = threading.Thread(target=receive_broadcast)
t1.start()
t2.start()
start()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论