这个也是在之前网友的基础下改的。费了很多时间。记录一下。希望能帮到有需要的人。
之前用了一个博主的视频socket传输,是从客户端发送到服务端,然后我想把方向改过来,但是一直没成功。后来转念一想,视频就是连续的图片,如果我能传输图片,那么传输视频应该也没问题,所以就尝试传输图片。
主要思路:服务端先对图片解码,然后发送;客户端接收,再解码,显示出来。接收的时候有个参数是接收数据的大小的,这个参数宜大不宜小,我测试发现小于图片大小会有问题。
注意:需要先运行服务端的py文件
1,服务端
#!/usr/bin/env python
# -*- coding=utf-8 -*-
import socket
import numpy as np
import urllib
import cv2
import threading
import time
print('this is Server')
img = cv2.imread('666.jpg')#这个是我本地的图片,和这个py文件在同一文件夹下,注意格式
# '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
img_encode = cv2.imencode('.jpg', img)[1]
data_encode = np.array(img_encode)
str_encode = data_encode.tostring()
encode_len = str(len(str_encode))
print(encode_len)#输出看一下encode码的大小,可有可无
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 6666))
s.listen(10)
except socket.error as msg:
print msg
sys.exit(1)
print 'Waiting connection...'
while True:
conn, addr = s.accept()
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start()
def deal_data(conn, addr):
print 'Accept new connection from {0}'.format(addr)
while True:
conn.send(str_encode)#发送图片的encode码
time.sleep(1)
conn.close()
socket_service()
2,客户端
#!/usr/bin/env python
# -*- coding=utf-8 -*-
import socket
import numpy as np
import urllib
import cv2
import threading
import time
def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))#连接服务端
except socket.error as msg:
print msg
sys.exit(1)
print('this is Client')
while True:
receive_encode = s.recv(2147483647)#接收的字节数 最大值 2147483647 (31位的二进制)
nparr = np.fromstring(receive_encode, dtype='uint8')
img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imshow("img_decode", img_decode)#显示图片
cv2.waitKey(1)
socket_client()
效果图:
附:测试完这个图片的解码后,后面应该可以用opencv获取摄像头画面帧,然后用类似的方法发送出去,从而达到传输视频的效果。