python opencv 播放网络视频_在python opencv中通过网络发送实时视频帧

一些事情:

>使用sendall而不是发送,因为你不能保证一切都会一次发送

> pickle可以用于数据序列化,但你必须制定一个协议

你拥有客户端和服务器之间交换的消息,这个

你可以事先知道要读取的数据量(见

下面)

>对于recv,如果你收到大块,你将获得更好的性能,所以将80替换为4096甚至更多

>小心sys.getsizeof:它返回内存中对象的大小,而不是

与通过网络发送的字节的大小(长度)相同;为一个

Python字符串这两个值根本不相同

>注意您发送的帧的大小.下面的代码支持最大65535的帧.如果您有一个更大的帧,请将“H”更改为“L”.

协议示例:

client_cv.py

import cv2

import numpy as np

import socket

import sys

import pickle

import struct ### new code

cap=cv2.VideoCapture(0)

clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

clientsocket.connect(('localhost',8089))

while True:

ret,frame=cap.read()

data = pickle.dumps(frame) ### new code

clientsocket.sendall(struct.pack("H", len(data))+data) ### new code

server_cv.py

import socket

import sys

import cv2

import pickle

import numpy as np

import struct ## new

HOST=''

PORT=8089

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print 'Socket created'

s.bind((HOST,PORT))

print 'Socket bind complete'

s.listen(10)

print 'Socket now listening'

conn,addr=s.accept()

### new

data = ""

payload_size = struct.calcsize("H")

while True:

while len(data) < payload_size:

data += conn.recv(4096)

packed_msg_size = data[:payload_size]

data = data[payload_size:]

msg_size = struct.unpack("H", packed_msg_size)[0]

while len(data) < msg_size:

data += conn.recv(4096)

frame_data = data[:msg_size]

data = data[msg_size:]

###

frame=pickle.loads(frame_data)

print frame

cv2.imshow('frame',frame)

你可以大量优化所有这些(减少复制,使用缓冲接口等),但至少你可以得到这个想法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值