LucaCimino / PynqMotionDetective

Progetto di Sistemi Digitali M Unibo
0 stars 0 forks source link

Esempio di connessione con RTSP #1

Open stefanospadari opened 5 months ago

stefanospadari commented 5 months ago

Ho aperto questa issue per curare la parte di connessione client server. L'idea è quella di avere un server (la fpga) che abbia una socket sulla quale resta in ascolto per le richieste di connessione. Il server ha indirizzo fisso e statico, alla quale deve riferirsi il Client e quando si accende deve effettuare la richiesta di connessione.

Una volta instaurata la connessione il server manderà stream video solo quando "rileverà movimenti". Potremmo partire da un esempio in cui mandiamo frame continuamente e poi provare a limitare l'invio solo quando abbiamo la rilevazione movimenti.

import socket
from pyshine import pyshine

def start_rtsp_server():
    # Configura il socket per l'ascolto sulla porta RTSP (per esempio, 8554)
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', 8554))
    server_socket.listen(5)

    print("Server RTSP in ascolto sulla porta 8554...")

    # Accetta la connessione dal client RTSP
    client_socket, client_address = server_socket.accept()
    print(f"Connessione accettata da {client_address}")

    # Inizializza un oggetto Pyshine per inviare dati RTSP allo stream
    rtsp_server = pyshine.RtspServer(client_socket)

    # Invia i dati RTSP (puoi personalizzare questa parte in base ai tuoi requisiti)
    rtsp_server.send_rtsp_response()
    rtsp_server.send_video()

    # Chiudi la connessione
    client_socket.close()
    server_socket.close()

if __name__ == "__main__":
    start_rtsp_server()
fmunibo commented 5 months ago

sudo apt-get update sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav

fmunibo commented 5 months ago

comandi per avviare una connessione da terminale

server: gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! x264enc ! rtph264pay pt=96 ! udpsink host=127.0.0.1 port=5000

client: gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false

stefanospadari commented 5 months ago

Abbiamo deciso di effettuare un resize per mandare un frame per pacchetto udp. due opzioni: RGB: 125x165. YUV: 205x155 (200x150)

stefanospadari commented 5 months ago

Server riceve frame dalla fotocamera, converte in YUV e fa resize a 205-155.

Client effettua la conversione dei colori in RGB e poi estende la dimensione della foto a 640x480 (resize).

stefanospadari commented 5 months ago

@fmunibo ti odio

tieni il codice senza utilizzo di moduli esterni

# Ottieni i dati del frame come bytes
    frame_data = yuv_frame.tobytes()

  # Ottieni la dimensione dei dati
    frame_size = len(frame_data)

    # Inserisci la dimensione dei dati nei primi 4 byte del pacchetto
    packet = frame_size.to_bytes(4, byteorder='big') + frame_data

    # Invia il pacchetto sulla socket
    udp_socket.sendto(packet, server_address)
stefanospadari commented 5 months ago

Decodifica il frame YUV

yuv_frame = np.frombuffer(frame_data, dtype=np.uint8).reshape((yuv_height, yuv_width))