思路比较简单,发送端通过open(file_path, "rb")
以比特打开,发送时候就不用编码了,服务器端同样的道理使用open('4.avi', "wb")
写入数据,使用tcp的原因是因为更稳定和方便,不用去编码视频顺序,虽然慢了点,但是满足了自己的需求。
下列代码是一个示范,使用时根据自己需求进行增加功能。
- 服务器端
import socket
import time
address = ('192.168.5.20', 5007) # 服务端地址和端口
cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
try:
cli.connect(address)
print('Server has connect')
break
except Exception:
print('[!] Server not found or noto pen')
time.sleep(1)
frame_count = 1
fp = open('4.avi', "wb")
while True:
time1 = time.time() if frame_count == 1 else time1
cli.sendall('ok'.encode()) # 发送看看是否连接
data = cli.recv(1024*1024*20) # 接受数据,可自定义大小
if data is not None:
fp.write(data)
end_time = time.time()
time2 = time.time()
frame_count += 1
cli.close()
- 发送端:
import socket
import os
import sys
import time
address = ('192.168.5.20', 5007) # 服务端地址和端口
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ser.bind(address)
ser.listen(5)
conn, addr = ser.accept()
print('连接对象:', addr)
count = 0
file_path = r'/home/pi/recoll/data/rgb/video/video2/20230403/2023-04-03 10-07-39.avi'
fp = open(file_path, "rb")
file_size = os.stat(file_path).st_size
print(file_size)
re_size = 0
sen_size = 1024*1024 # 发送数据大小
time1 = time.time()
while True:
try:
if not conn.recv(sen_size):
break
if file_size - re_size >= sen_size: # 文件切片大小,大小可自定义
data = fp.read(sen_size)
re_size += sen_size
else:
data = fp.read(file_size - re_size)
print("data lenth :{0}".format(len(data)))
if not data:
print("{0} file sendall over...".format(file_path))
break
count += 1
conn.sendall(data)
except KeyboardInterrupt:
print('KeyboardInterrupt')
sys.exit(0)
time2 = time.time()
print("传输耗费时间:"+str(time2-time1))