网络编程
位置:首页>> 网络编程>> Python编程>> python实现不同电脑之间视频传输功能

python实现不同电脑之间视频传输功能

作者:景唯acr  发布时间:2021-01-07 00:03:40 

标签:python,视频传输

1. imageZMQ库实现

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

python实现不同电脑之间视频传输功能

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

发送端


import socket
import time
import cv2
import imagezmq
import traceback
import 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 cv2
import imagezmq
import traceback
import time
import simplejpeg

# 接收发送端数据,输入发送端的ip地址
image_hub = imagezmq.ImageHub(open_port='tcp://192.168.100.104:5555',REQ_REP=False)
frame_count = 1
time1 = 0
while 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协议实现

python实现不同电脑之间视频传输功能
发送端


import socket
import cv2

import sys
import numpy as np
address = ('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 = 0
while 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 socket
import sys
import cv2
import numpy as np
import time
address = ('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 = 1
while 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 += 1
cli.close()

来源:https://blog.csdn.net/weixin_41735859/article/details/118160856

0
投稿

猜你喜欢

  • 模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中。此类中的大部分函数都与对文件的操作方法类似。例:#coding=gb
  • Python实现对网易云音乐的数据进行一个数据清洗和可视化分析对音乐数据进行数据清洗与可视化分析关于数据的清洗,实际上在上一一篇文章关于抓取
  • 1、确认框架中安装了第三方alibabacoud控件实现代码如下上传过程中遇到任务问题,可以进行留言<?php namespace A
  • 本文实例分析了python动态性强类型用法。分享给大家供大家参考。具体如下:Python变量声明和定义与C#不同,Python在使用变量之前
  •     笔者日积月累了许多精彩、实用的Web特效的制作,这些特效几乎都是比较常用的网页特效。现在我就把这些经过
  • 我们经常使用傅里叶变换来计算数字信号的频谱,进而分析数字信号,离散时间傅里叶变换的公式为:可是自己动手实现一遍才是最好的学习。在数字分析里面
  • 今天我们来学习字符串数据类型相关知识,将讨论如何声明字符串数据类型,字符串数据类型与 ASCII 表的关系,字符串数据类型的属性,以及一些重
  • 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项可以是不同的类型,可以是字符串,可以是数字类型,甚至
  • Turtle图形库Turtle 库是 Python 内置的图形化模块,属于标准库之一,位于 Python 安装目录的 lib 文件夹下,常用
  • 可及,通俗的说是“可以达到”,加上主语和宾语,在“交互设计”这个大的语境下,含义应该是“用户可以达到自己的操作目标”,这不是和“有效性—用户
  • &ldquo;深入认识Python内建类型&rdquo;这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型。
  • 对比Google Chrome、IE来说,在Windows环境下,Firefox 3.5的启动速度非常慢,据说是因为Firefox 3.5从
  • 在网页设计初期,我们会先收集大家对设计方向的期许,我们经常收集到这样的建议:产品经理:要易用,要简洁设计总监:要特色,要亮点部门经理:要大气
  • TTS简介TTS(Text To Speech)是一种语音合成技术,可以让机器将输入文本以语音的方式播放出来,实现机器说话的效果。TTS分成
  • 现在基于WEB页的HTML的编辑器在新闻系统,文章系统中用得越来越广,一个网页一粘就可以保持原来的样式,同时图片也可以在这个页中保持。但是在
  • 分页是每一个程序需要去理解的东西,学习过的几门语言中我发现分页原理都是一样的,下面为php初学者分析一下php分页实现与最后面补充了一个超级
  • 本文实例为大家分享了JS实现拖动模糊框特效的具体代码,供大家参考,具体内容如下需求:在图片上拖动按钮,图片蒙层慢慢覆盖,当蒙层边缘碰到左右下
  • 1.元组的概念Python中的元组和列表很相似,元组也是Python语言提供的内置数据结构之一,可以在代码中直接使用。元组和列表就像是一个孪
  • Python字符串拼接的6种方法:1.加号第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接
  • 一、分析网页网站的页面是 JavaScript 渲染而成的,我们所看到的内容都是网页加载后又执行了JavaScript代码之后才呈现出来的,
手机版 网络编程 asp之家 www.aspxhome.com