You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向服务器发送视频?视频发送后时长过短问题求助

视频发送后时长不足一秒的问题解决

问题描述

代码可正常运行,但发送至服务器的视频时长仅不足一秒,怀疑该问题由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()

代码执行完成后文件已成功发送,但视频时长仅不足一秒,需解决该异常。

问题根源

  1. 视频文件未完整写入:客户端中,写入300帧后直接读取文件发送,但VideoWriter的release()方法在发送之后才执行。VideoWriter会缓存部分帧数据,只有调用release()才会将所有缓存帧写入文件,否则生成的视频文件不完整,导致时长异常。
  2. 文件发送不完整:客户端仅读取并发送两次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,提问作者Мирослав Незгодюк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:12:40