2021电赛 代码记录。
- server.py
import socket # 导入socket模块,用于网络通信
import time # 导入time模块,用于计时操作
import cv2 # 导入cv2模块,用于图像处理
import numpy # 导入numpy模块,用于数组操作
def receive_video():
address = ('0.0.0.0', 8002) # 定义服务器地址和端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP套接字对象
s.bind(address) # 将套接字绑定到指定地址
s.listen(1) # 开始监听传入连接
def recv_all(sock, count):
# 自定义函数,用于接收指定数量的数据
buf = b'' # 定义一个空字节串
while count:
new_buf = sock.recv(count) # 接收数据
if not new_buf:
return None # 如果接收失败,返回None
buf += new_buf # 将接收到的数据追加到buf中
count -= len(new_buf) # 减去已接收数据的长度
return buf
conn, addr = s.accept() # 接受客户端连接并返回连接对象和客户端地址
print('Connected from:', addr) # 打印客户端地址
while True:
start = time.time() # 记录开始时间
length = recv_all(conn, 16) # 接收图像数据的长度,16代表接收长度
string_data = recv_all(conn, int(length)) # 接收图像数据
data = numpy.frombuffer(string_data, numpy.uint8) # 将接收到的数据转换为numpy数组
dec_img = cv2.imdecode(data, cv2.IMREAD_COLOR) # 解码数组为图像
cv2.imshow('SERVER', dec_img) # 在窗口中显示图像
end = time.time() # 记录结束时间
seconds = end - start # 计算时间差
fps = 1 / seconds # 计算帧率
conn.send(bytes(str(int(fps)), encoding='utf-8')) # 发送帧率给客户端
k = cv2.waitKey(10) & 0xFF # 等待按键输入,如果按下ESC键,则退出循环
if k == 27:
break
s.close() # 关闭套接字
cv2.destroyAllWindows() # 关闭窗口
if __name__ == '__main__':
receive_video()
- Client.py
import socket # 导入socket模块,用于网络通信
import cv2 # 导入cv2模块,用于图像处理
import numpy # 导入numpy模块,用于数组操作
import time # 导入time模块,用于计时操作
import sys # 导入sys模块,用于系统相关操作
def send_video():
address = ('127.0.0.1', 8002) # 定义服务器地址和端口
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP套接字对象
sock.connect(address) # 连接到服务器
except socket.error as msg:
print(msg) # 打印错误信息
sys.exit(1) # 退出程序
capture = cv2.VideoCapture('rtmp://ns8.indexforce.com/home/mystream') # 打开视频流
ret, frame = capture.read() # 读取一帧图像
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 15] # 图像编码参数
while ret:
time.sleep(0.01) # 暂停0.01秒,控制发送速率
frame = cv2.resize(frame, dsize=(400, 400)) # 调整图像大小为400x400
frame = cv2.rectangle(frame, (0, 200), (400, 200), (255, 255, 255), 3) # 在图像上绘制矩形
frame = cv2.rectangle(frame, (200, 0), (200, 400), (255, 255, 255), 5) # 在图像上绘制矩形
result, imgencode = cv2.imencode('.jpg', frame, encode_param) # 将图像编码为JPEG格式
data = numpy.array(imgencode) # 将编码后的图像转换为numpy数组
string_data = data.tostring() # 将数组转换为字符串
sock.send(str(len(string_data)).encode('utf-8').ljust(16)) # 发送图像数据长度
sock.send(string_data) # 发送图像数据
receive = sock.recv(1024) # 接收服务器返回的数据
if len(receive):
print(str(receive, encoding='utf-8')) # 打印接收到的数据
ret, frame = capture.read() # 读取下一帧图像
if cv2.waitKey(10) == 27: # 如果按下ESC键,则退出循环
break
sock.close() # 关闭套接字
if __name__ == '__main__':
send_video()