如何向服务器发送视频?视频发送后时长过短问题求助
视频发送后时长不足一秒的问题解决
问题描述
代码可正常运行,但发送至服务器的视频时长仅不足一秒,怀疑该问题由OpenCV导致。以下是服务端与客户端代码:
服务端代码
import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("localhost", 4344)) server.listen() user, adres = server.accept() print('Connect') file = open('po.avi', mode='wb') data = user.recv(102400) while data: file.write(data) data = user.recv(102400)
客户端代码
import socket import cv2 flag = True count = 0 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('localhost', 4344)) cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FPS, 50) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) codec = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', codec, 25.0, (1280, 720)) while count != 300: ret, img = cap.read() if cv2.waitKey(10) == 27: break print('s') frame = out.write(img) count += 1 file = open("output.avi", mode='rb') data = file.read(102400) client.send(data) data = file.read(102400) file.close() client.close() out.release() cap.release() cv2.destroyAllWindows()
代码执行完成后文件已成功发送,但视频时长仅不足一秒,需解决该异常。
问题根源
- 视频文件未完整写入:客户端中,写入300帧后直接读取文件发送,但
VideoWriter的release()方法在发送之后才执行。VideoWriter会缓存部分帧数据,只有调用release()才会将所有缓存帧写入文件,否则生成的视频文件不完整,导致时长异常。 - 文件发送不完整:客户端仅读取并发送两次102400字节的数据,没有循环读取直到文件末尾,大文件会出现发送不全的情况,进一步导致视频播放异常。
修复方案
修改客户端代码,调整资源释放顺序并完善文件发送逻辑:
import socket import cv2 count = 0 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('localhost', 4344)) cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FPS, 50) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) codec = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', codec, 25.0, (1280, 720)) while count != 300: ret, img = cap.read() if not ret: # 确保读取到有效帧 break if cv2.waitKey(10) == 27: break print('s') out.write(img) count += 1 # 先释放视频写入和摄像头资源,保证文件完整写入 out.release() cap.release() cv2.destroyAllWindows() # 循环发送整个文件 file = open("output.avi", mode='rb') data = file.read(102400) while data: client.send(data) data = file.read(102400) file.close() client.close()
关键修改说明
- 调整资源释放顺序:在读取发送视频文件前,先调用
out.release()和cap.release(),确保所有帧数据都写入文件。 - 完善文件发送循环:通过
while循环持续读取文件直到数据为空,保证完整发送整个视频文件。 - 增加帧有效性判断:添加
if not ret:的判断,避免读取失败时写入无效数据。
内容的提问来源于stack exchange,提问作者Мирослав Незгодюк
相关产品推荐
相关产品推荐

