сохранение живого видеокадра по сети в Python OpenCV - PullRequest
0 голосов
/ 10 октября 2019

Я использую rapsberrypi для отправки видеокадра и получаю его на Ubuntu. Я успешно отправляю и получаю видеокадр и показываю его, но я хочу сохранить кадр в видео. Поэтому я использую fourcc и cv2.VideoWriter для его сохранения. Вот мой код, но он не работает.

Это работает Raspberrypi 3B +, 18.04 Linux Server.

Client.py

import cv2
import io
import socket
import struct
import time
import pickle
import zlib

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.1.124', 8485))
connection = client_socket.makefile('wb')

cam = cv2.VideoCapture(0)

cam.set(3, 320);
cam.set(4, 240);

img_counter = 0

encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]

while True:
    ret, frame = cam.read()
    result, frame = cv2.imencode('.jpg', frame, encode_param)
    data = pickle.dumps(frame, 0)
    size = len(data)


    print("{}: {}".format(img_counter, size))
    client_socket.sendall(struct.pack(">L", size) + data)
    img_counter += 1

cam.release()
client_socket.close()

Server.py

import socket
import sys
import cv2
import pickle
import numpy as np
import struct ## new
import zlib
import datetime

HOST=''
PORT=8485

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

fcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X)
out = cv2.VideoWriter(datetime.datetime.now().strftime("%d_%H-%M-%S.avi"), fcc, 25.0, (640,480))

data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
    while len(data) < payload_size:
        print("Recv: {}".format(len(data)))
        data += conn.recv(4096)

    print("Done Recv: {}".format(len(data)))
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(data) < msg_size:
        data += conn.recv(4096)
    frame_data = data[:msg_size]
    data = data[msg_size:]

    frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    cv2.imshow('ImageWindow',frame)
    out.write(frame)
    cv2.waitKey(1)

out.release()
cv2.destroyAllWindows()
s.close()

Сообщение об ошибке было «Произошла ошибка. Не удалось демультиплексировать поток. в приложении Linux Videos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...