【问题标题】:how to send live video over network in python如何在python中通过网络发送实时视频
【发布时间】:2017-04-08 19:26:03
【问题描述】:

我正在尝试将视频从客户端发送到服务器并在服务器端显示。问题是当我运行代码时,我得到一个空的无响应窗口!

这是我正在使用的代码,我在这里找到了 https://stackoverflow.com/a/30988516/4663461

client.py

import cv2
import numpy as np
import socket
import sys
import pickle
import struct 

cap=cv2.VideoCapture(path_to_video)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8089))

while True:
    ret,frame=cap.read()
    data = pickle.dumps(frame)
    clientsocket.sendall(struct.pack("L", len(data))+data)

server.py

import socket
import sys
import cv2
import pickle
import numpy as np
import struct 

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()


data = b''
payload_size = struct.calcsize("L") 
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("L", 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)

【问题讨论】:

标签: python sockets opencv


【解决方案1】:

我有点晚了,但我创建了强大的线程化 VidGear 视频处理 python 库,现在提供 NetGear API,它专门用于通过网络在互连系统之间实时同步传输视频帧通过 ZmQ 消息系统。为方便起见,这是一个最低限度的示例:

A.服务器端:(Bare-Minimum 示例)

打开您喜欢的终端并执行以下 python 代码:

注意: 您可以随时在服务器端和客户端通过在服务器端按键盘上的 [Ctrl+c] 来结束流式传输!

# import libraries
from vidgear.gears import VideoGear
from vidgear.gears import NetGear

stream = VideoGear(source='test.mp4').start() #Open any video stream
server = NetGear() #Define netgear server with default settings

# infinite loop until [Ctrl+C] is pressed
while True:
    try: 
        frame = stream.read()
        # read frames

        # check if frame is None
        if frame is None:
            #if True break the infinite loop
            break

        # do something with frame here

        # send frame to server
        server.send(frame)

    except KeyboardInterrupt:
        #break the infinite loop
        break

# safely close video stream
stream.stop()
# safely close server
writer.close()

B.客户端:(最简单的例子)

然后在同一系统上打开另一个终端并执行以下python代码并查看输出:

# import libraries
from vidgear.gears import NetGear
import cv2

#define netgear client with `receive_mode = True` and default settings
client = NetGear(receive_mode = True)

# infinite loop
while True:
    # receive frames from network
    frame = client.recv()

    # check if frame is None
    if frame is None:
        #if True break the infinite loop
        break

    # do something with frame here

    # Show output window
    cv2.imshow("Output Frame", frame)

    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break

# close output window
cv2.destroyAllWindows()
# safely close client
client.close()

注意: NetGear 目前仅支持两种 ZeroMQ 消息传递模式:即zmq.PAIRzmq.REQ and zmq.REP,支持的协议为:'tcp', 'upd', 'pgm', 'inproc', 'ipc'

更多高级用法可以在这里找到:https://github.com/abhiTronix/vidgear/wiki/NetGear

【讨论】:

    【解决方案2】:
    frame=pickle.loads(frame_data)
    print frame
    cv2.imshow('frame',frame)
    # add this
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    

    【讨论】:

    • 也提供一些细节!
    【解决方案3】:

    我遇到了同样的问题。原来是我的笔记本电脑。检查您的显卡驱动程序更新和您的 python 版本。并非所有版本都能正常使用 opencv。

    【讨论】:

    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2017-09-26
    • 1970-01-01
    • 2013-02-16
    • 2016-02-03
    相关资源
    最近更新 更多