您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python实现不同电脑之间视频传输功能

51自学网 2021-10-30 22:26:45
  python
这篇教程python实现不同电脑之间视频传输功能写得很实用,希望能帮到您。

1. imageZMQ库实现

imageZMQ库链接:https://github.com/jeffbass/imagezmq
该库原本是用于树莓派上的视频传输,其包含很多示例,有兴趣可以去看看。

在这里插入图片描述

上图中间的笔记本为发送端,其余两个屏幕显示的是接收端视频。本文视频传输实现的前提是确保发送端和接收端接在同一个局域网下。

发送端

import socketimport timeimport cv2import imagezmqimport tracebackimport simplejpeg# capture=cv2.VideoCapture(0) # 获取摄像头视频capture=cv2.VideoCapture(r"D:/project/dataset/video/测试.mp4")# 192.168.100.104 为发送端主机ip地址sender = imagezmq.ImageSender(connect_to='tcp://192.168.100.104:5555', REQ_REP=False)rpi_name = socket.gethostname() # 获取主机名time.sleep(2.0)  jpeg_quality = 95   #调整图片压缩质量,95%while(True):    try:        ref, frame=capture.read(0)        time.sleep(1/60)        image = cv2.resize(frame,(1280,720))        curtime = time.time()        msg = rpi_name+'*'+str(curtime)        # 通过simplejpeg函数将图片编码为jpeg格式,提高传输效率        jpg_buffer = simplejpeg.encode_jpeg(image, quality=jpeg_quality,                                            colorspace='BGR')        sender.send_jpg(msg, jpg_buffer)        cv2.imshow(rpi_name, image)        cv2.waitKey(1)    except:        print(traceback.print_exc())        break

接收端(可以多台设备同时接收)

import cv2import imagezmqimport tracebackimport timeimport simplejpeg# 接收发送端数据,输入发送端的ip地址image_hub = imagezmq.ImageHub(open_port='tcp://192.168.100.104:5555',REQ_REP=False)frame_count = 1time1 = 0while True:    try:        time1 = time.time() if frame_count == 1 else time1        name, image = image_hub.recv_jpg()        # 解码        image = simplejpeg.decode_jpeg(image, colorspace='BGR')        cv2.imshow(name.split('*')[0], image)        cv2.waitKey(1)        time2 = time.time()        print(image.shape[:2], int(frame_count/(time2-time1)))        frame_count += 1    except:        print(traceback.format_exc())        break

2. TCP协议实现

在这里插入图片描述
发送端

import socketimport cv2import sysimport numpy as npaddress = ('192.168.100.104', 5005)  # 服务端地址和端口ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)ser.bind(address)ser.listen(5)# 阻塞式print('waiting。。。')conn, addr = ser.accept()print('建立连接...')print('连接对象:', addr)cap = cv2.VideoCapture(r"D:/project/dataset/video/测试.mp4")# cap = cv2.VideoCapture(0)frames_num=cap.get(7)print('视频总帧数:',frames_num)print('发送目标...')count = 0while cap.isOpened():    try:        data = conn.recv(1024)        data = data.decode()        if not data:            break        ret, frame = cap.read()        frame = cv2.resize(frame,(1280,720))        cv2.imshow('send', frame)        cv2.waitKey(1)        count += 1        # 数据打包有很多方式,也可以用json打包        img_encode = cv2.imencode('.jpg', frame)[1]        data_encode = np.array(img_encode)        str_encode = data_encode.tostring()        conn.sendall(str_encode)    except KeyboardInterrupt:        print('KeyboardInterrupt')        sys.exit(0)

接收端

import socketimport sysimport cv2import numpy as npimport timeaddress = ('192.168.100.104', 5005)  # 服务端地址和端口cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:    cli.connect(address)  # 尝试连接服务端except Exception:    print('[!] Server not found or not open')    sys.exit()frame_count = 1while True:    time1 = time.time() if frame_count == 1 else time1    trigger = 'ok'    cli.sendall(trigger.encode())    data = cli.recv(1024*1024*20)    image = np.frombuffer(data, np.uint8)    image = cv2.imdecode(image,cv2.IMREAD_COLOR)    cv2.imshow('video',image)    cv2.waitKey(1)    end_time = time.time()    time2 = time.time()    print(image.shape[:2], int(frame_count / (time2 - time1)))    frame_count += 1cli.close()

到此这篇关于python实现不同电脑之间视频传输的文章就介绍到这了,更多相关python视频传输内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


使用Python获取公众号下所有的文章
Python的子线程和子进程是如何手动结束的?
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。