Keep PiCamera object always active after client connection breaks

Viewed 21

I'm using the tremendous picamera package on my RPi4. In particular, the server side code

import socket
import time
import picamera

camera = picamera.PiCamera()
camera.resolution = (640, 480)
camera.framerate = 24

server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8000))
server_socket.listen(0)

# Accept a single connection and make a file-like object out of it
connection = server_socket.accept()[0].makefile('wb')
try:
    camera.start_recording(connection, format='h264')
    camera.wait_recording(60)
    camera.stop_recording()
finally:
    connection.close()
    server_socket.close()

as offered at PiCamera Basic Recipes. This code works just fine.

I modified the code such that it

  • records forever instead of only 60 seconds and
  • the server socket keeps listening forever

like so:

import socket
import time
import picamera

camera = picamera.PiCamera()
camera.resolution = (640, 480)
camera.framerate = 30

server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8000))
server_socket.listen(0)

while True:  # Keep listening forever.
    client_socket, client_address = server_socket.accept()
    print(f"New connection from {client_address}.")
    connection = client_socket.makefile('wb')
    try:
        camera.start_recording(connection, format='h264')
        while True:  # To never stop streaming.
            camera.wait_recording(1)
        camera.stop_recording()
    except BrokenPipeError as error:
        print(f"Error {error} occured.")
        # camera.stop_recording()  # If I use this line I get ConnectionResetError, and if not, I get PiCameraAlreadyRecording.
    finally:
        pass
    #    connection.close()
    #    server_socket.close()

I unfortunately now have the problem that I cannot seem to reconnect to the PiCamera object because of the camera.stop_recording(), as described in the comments thereafter. I get a ConnectionResetError or PiCameraAlreadyRecording error.

On the client side I use the code

import numpy as np
import cv2
import sys
import datetime

server = 'http://192.168.178.54:8000/'
video_capture_0 = cv2.VideoCapture(server)
fourcc = cv2.VideoWriter_fourcc(*"mp4v")  # Fourcc's that work under Ubuntu 22.04: mp4v, ...
date_time_now = datetime.datetime.now()
yyyymmddHHMMSS = date_time_now.strftime("%Y-%m-%d_%H%M%S")
video_write_0 = cv2.VideoWriter(f"{yyyymmddHHMMSS}.mp4", fourcc, 30.0, (640, 480))  # To save the stream to a file.

while True:
    ret0, frame0 = video_capture_0.read()

    if ret0:
        frame0 = cv2.flip(frame0, 0)  # Flip image vertically.
        cv2.imshow('Test 0', frame0)
        video_write_0.write(frame0)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture_0.release()
video_write_0.release()
cv2.destroyAllWindows()

How do I fix this?

0 Answers
Related