当前位置:   article > 正文

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

python不同主机视频传输

1. imageZMQ库实现

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

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

发送端

  1. import socket
  2. import time
  3. import cv2
  4. import imagezmq
  5. import traceback
  6. import simplejpeg
  7. # capture=cv2.VideoCapture(0) # 获取摄像头视频
  8. capture=cv2.VideoCapture(r"D:\project\dataset\video\测试.mp4")
  9. # 192.168.100.104 为发送端主机ip地址
  10. sender = imagezmq.ImageSender(connect_to='tcp://192.168.100.104:5555', REQ_REP=False)
  11. rpi_name = socket.gethostname() # 获取主机名
  12. time.sleep(2.0)
  13. jpeg_quality = 95 #调整图片压缩质量,95%
  14. while(True):
  15. try:
  16. ref, frame=capture.read(0)
  17. time.sleep(1/60)
  18. image = cv2.resize(frame,(1280,720))
  19. curtime = time.time()
  20. msg = rpi_name+'*'+str(curtime)
  21. # 通过simplejpeg函数将图片编码为jpeg格式,提高传输效率
  22. jpg_buffer = simplejpeg.encode_jpeg(image, quality=jpeg_quality,
  23. colorspace='BGR')
  24. sender.send_jpg(msg, jpg_buffer)
  25. cv2.imshow(rpi_name, image)
  26. cv2.waitKey(1)
  27. except:
  28. print(traceback.print_exc())
  29. break

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

  1. import cv2
  2. import imagezmq
  3. import traceback
  4. import time
  5. import simplejpeg
  6. # 接收发送端数据,输入发送端的ip地址
  7. image_hub = imagezmq.ImageHub(open_port='tcp://192.168.100.104:5555',REQ_REP=False)
  8. frame_count = 1
  9. time1 = 0
  10. while True:
  11. try:
  12. time1 = time.time() if frame_count == 1 else time1
  13. name, image = image_hub.recv_jpg()
  14. # 解码
  15. image = simplejpeg.decode_jpeg(image, colorspace='BGR')
  16. cv2.imshow(name.split('*')[0], image)
  17. cv2.waitKey(1)
  18. time2 = time.time()
  19. print(image.shape[:2], int(frame_count/(time2-time1)))
  20. frame_count += 1
  21. except:
  22. print(traceback.format_exc())
  23. break

2. TCP协议实现

发送端

  1. import socket
  2. import cv2
  3. import sys
  4. import numpy as np
  5. address = ('192.168.100.104', 5005) # 服务端地址和端口
  6. ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. ser.bind(address)
  8. ser.listen(5)
  9. # 阻塞式
  10. print('waiting。。。')
  11. conn, addr = ser.accept()
  12. print('建立连接...')
  13. print('连接对象:', addr)
  14. cap = cv2.VideoCapture(r"D:\project\dataset\video\测试.mp4")
  15. # cap = cv2.VideoCapture(0)
  16. frames_num=cap.get(7)
  17. print('视频总帧数:',frames_num)
  18. print('发送目标...')
  19. count = 0
  20. while cap.isOpened():
  21. try:
  22. data = conn.recv(1024)
  23. data = data.decode()
  24. if not data:
  25. break
  26. ret, frame = cap.read()
  27. frame = cv2.resize(frame,(1280,720))
  28. cv2.imshow('send', frame)
  29. cv2.waitKey(1)
  30. count += 1
  31. # 数据打包有很多方式,也可以用json打包
  32. img_encode = cv2.imencode('.jpg', frame)[1]
  33. data_encode = np.array(img_encode)
  34. str_encode = data_encode.tostring()
  35. conn.sendall(str_encode)
  36. except KeyboardInterrupt:
  37. print('KeyboardInterrupt')
  38. sys.exit(0)

接收端

  1. import socket
  2. import sys
  3. import cv2
  4. import numpy as np
  5. import time
  6. address = ('192.168.100.104', 5005) # 服务端地址和端口
  7. cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. try:
  9. cli.connect(address) # 尝试连接服务端
  10. except Exception:
  11. print('[!] Server not found or not open')
  12. sys.exit()
  13. frame_count = 1
  14. while True:
  15. time1 = time.time() if frame_count == 1 else time1
  16. trigger = 'ok'
  17. cli.sendall(trigger.encode())
  18. data = cli.recv(1024*1024*20)
  19. image = np.frombuffer(data, np.uint8)
  20. image = cv2.imdecode(image,cv2.IMREAD_COLOR)
  21. cv2.imshow('video',image)
  22. cv2.waitKey(1)
  23. end_time = time.time()
  24. time2 = time.time()
  25. print(image.shape[:2], int(frame_count / (time2 - time1)))
  26. frame_count += 1
  27. cli.close()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/280346
推荐阅读
相关标签
  

闽ICP备14008679号