1

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?

Adriaan
  • 715
  • 10
  • 22

0 Answers0