gpt4 book ai didi

python - UDP视频流延迟-OPENCV Python

转载 作者:行者123 更新时间:2023-12-02 16:37:25 30 4
gpt4 key购买 nike

我有流视频UDP,但是数据包被延迟并且困惑。
这是我从opencv网站上获取的引用代码。

但是当我给Socket.Stream使用TCP连接时,它的流很好并且帧是连续的。

Server.py

import socket
import numpy
import time
import cv2

UDP_IP = "127.0.0.1"
UDP_PORT = 999
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))


s=b''

while True:

data, addr = sock.recvfrom(46080)

s += data

if len(s) == (46080*20):

frame = numpy.fromstring (s,dtype=numpy.uint8)
frame = frame.reshape (480,640,3)

cv2.imshow('frame',frame)

s=b''

if cv2.waitKey(1) & 0xFF == ord ('q'):
break

客户端
import socket
import numpy as np
import cv2

UDP_IP = '127.0.0.1'
UDP_PORT = 999
cap = cv2.VideoCapture(0)
#cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
#cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)
def xrange(x):

return iter(range(x))
while (True):
ret, frame = cap.read()
cv2.imshow('frame', frame)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
d = frame.flatten()
s = d.tostring()
for i in xrange(20):
sock.sendto(s[i * 46080:(i + 1) * 46080], (UDP_IP, UDP_PORT))
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

最佳答案

看起来client.py脚本发送UDP帧的速度(比server.py将它们拼接在一起的速度快得多)。我不知道为什么会这样。也许在每次迭代后增加了字节s的大小之后,Python需要找到一个新的位置来存储s,这会使它丢失从client.py发送的帧。但是,同步它们的一种方法是在client.py确认收到帧之后,告诉server.py发送。

在下面的代码中,server.py将通过b'eframe'监听图像的开始传输。 server.py将使用client.py连续答复b'n'以提示发送下一帧。 client.py将通过发送b'eframe'通知图像结束

server.py

import socket
import numpy
import time
import cv2

UDP_IP = "127.0.0.1"
UDP_PORT = 999
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))


s=b''

while True:

data, addr = sock.recvfrom(6) # b'eframe' is 6 byte long

if data == b'sframe':
while True:
sock.sendto(b'n', addr)
data, addr = sock.recvfrom(46080)
if data == b'eframe':
break
s += data

if len(s) == (46080*20):

frame = numpy.fromstring (s,dtype=numpy.uint8)
frame = frame.reshape (480,640,3)

cv2.imshow('frame',frame)

s=b''

if cv2.waitKey(1) & 0xFF == ord ('q'):
break

client.py

import socket
import numpy as np
import cv2

UDP_IP = '127.0.0.1'
UDP_PORT = 999
cap = cv2.VideoCapture(0)
#cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
#cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)
def xrange(x):

return iter(range(x))
while (True):
ret, frame = cap.read()
cv2.imshow('frame', frame)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
d = frame.flatten()
s = d.tostring()

sock.sendto(b'sframe', (UDP_IP, UDP_PORT))
for i in xrange(20):
data, addr = sock.recvfrom(1) # b'n' is 1 byte long
if data == b'n':
sock.sendto(s[i * 46080:(i + 1) * 46080], (UDP_IP, UDP_PORT))
data, addr = sock.recvfrom(1)
sock.sendto(b'eframe', (UDP_IP, UDP_PORT))

if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

关于python - UDP视频流延迟-OPENCV Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284414/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com