最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - How can I encode my webcam stream towards a remote desktop service? - Stack Overflow

programmeradmin5浏览0评论

I am trying to stream my webcam into a remote desktop service, AWS in this case. I managed to get it to work but I am getting a lot of framedrops. Someone suggested to me that I wasn't encoding my webcam and that that was the problem, that I am sending raw camera data , which is something like 327Mbps, which is very hard for the network to process all at once. Or at least that's how I understand it.

I am pretty new to python and don't really know how to approach this, any help would be greatly appreciated!

These are the two scripts that I run to connect to my instance via sockets.

On the server side:

server_side.py

import pickle
import socket
import struct

import cv2

HOST = ''
PORT = somenumber

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'' ### CHANGED
payload_size = struct.calcsize("L") ### CHANGED

while True:

    # Retrieve message size
    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] ### CHANGED

    # Retrieve all data based on message size
    while len(data) < msg_size:
        data += conn.recv(4096)

    frame_data = data[:msg_size]
    data = data[msg_size:]

    # Extract frame
    frame = pickle.loads(frame_data)

    # Display
    cv2.imshow('frame', frame)
    cv2.waitKey(1)

On the client side:

client_side.py

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

cap=cv2.VideoCapture(0)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('my_IP',somenumber))

while True:
    ret,frame=cap.read()
    # Serialize frame
    data = pickle.dumps(frame)

    # Send message length first
    message_size = struct.pack("L", len(data)) ### CHANGED

    # Then data
    clientsocket.sendall(message_size + data)
发布评论

评论列表(0)

  1. 暂无评论