registrare e riprodurre video in streaming dalla telecamera contemporaneamente


10

Sto registrando video da Pi utilizzando Camera Module con Picamera:

import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (640, 480)
    camera.start_recording('1.h264')
    camera.wait_recording(5)
    for i in range(2, 11):
        camera.split_recording('%d.h264' % i)
        camera.wait_recording(5)
    camera.stop_recording()

Ho usato separatamente una combinazione di raspivide gstreamerper lo streaming video da PI senza alcun ritardo. C'è un modo per archiviare e trasmettere in streaming filmati usando Python contemporaneamente ?

Penso che ci debba essere un modo per utilizzare la fotocamera come input e creare due sorgenti di output: un video 720p per l'archiviazione e un video 240p ridimensionato per lo streaming utilizzando gstreamer ...?


Se stai eseguendo il piping raspividpuoi teel'output in un file e gstreamer o qualsiasi altra cosa (vedi man tee). Finché uno stream è direttamente su disco, non aggiungerà molto overhead, ma se si desidera elaborare l'input in due diversi formati contemporaneamente, penso che sarà troppo lavoro da gestire per il pi.
riccioli d'oro

Puoi gentilmente pubblicare un esempio nel codice?
Koogee,

Risposte:


5

Il teecomando legge da input standard e copia in qualsiasi numero di file più output standard per impostazione predefinita, vedere man teeper maggiori dettagli. Ciò significa che puoi chiedere a tee di creare un file dall'input e quindi reindirizzare l'output a qualcos'altro.

L'aggiunta di un tubo aggiuntivo in teoria aggiunge un po 'di inefficienza. Se questo è significativo o no, dovrai giudicare te stesso usando il tuo metodo di streaming. Il mio metodo attuale non è soddisfacente alla massima risoluzione. Non è un grande interesse in questo momento, ma quando lo è, cercherò di trovare qualcosa di meglio (ad es. Presumibilmente gstreamer funziona meglio del clvc).

Tuttavia, vale la pena notare che il file salvato localmente sul pi allo stesso tempo è di qualità perfetta, quindi l'attività non interferisce con raspivid. Ecco un esempio:

raspivid -o - -t 0 | tee test_video.h264 |
cvlc -v stream:///dev/stdin --sout '#standard{access=http,mux=ts,dest=:8080' :demux=h264

L'ho diviso in due righe per leggibilità; puoi premere return after |(pipe) e terminare il comando proprio come puoi interrompere una linea con \. Puoi sostituirlo cvlccon quello che vuoi. Ancora una volta, sebbene il flusso fosse di scarsa qualità, test_video.h264è risultato perfetto.

Se abbasso la risoluzione a 640x360 questa disposizione va bene, con un secondo o due di latenza che è quello che ottengo normalmente. Non credo teeche il secondo tubo faccia alcuna differenza per la qualità del flusso; questi sono in grado di offrire un throughput molto più elevato del necessario qui e non richiedono molto in termini di risorse di sistema.

La CPU ha funzionato al 35-45%, il che è lo stesso che accade quando si trasmettono video in streaming tee.


Grazie per il tuo post. Dato che voglio farlo all'interno del mio script, ho esaminato l'API PiCamera 1.9 e esiste un metodo record_sequenceche accetta un splitter_portparametro. C'è anche un esempio di registrazione fino a 4 uscite simultanee dalla telecamera.
Koogee,

Faccio fatica a legare insieme la registrazione di un flusso a 240p e un video a 720p per l'archiviazione che si divide ogni ora, ma ritengo che questa sia una direzione promettente.
Koogee,

8

Niente di male con la risposta ai riccioli d'oro sopra, ma eccone uno aggiuntivo che si occupa specificamente dell'API di picamera. È possibile utilizzare un output personalizzato per eseguire tale suddivisione (in tutti i modi desiderati) e inviare l'output a varie destinazioni. Nel tuo caso, se volessi registrare su un file e un socket, potresti fare qualcosa del genere:

#!/usr/bin/env python

import io
import picamera
import socket


# An output (as far as picamera is concerned), is just a filename or an object
# which implements a write() method (and optionally the flush() and close()
# methods)
class MyOutput(object):
    def __init__(self, filename, sock):
        self.output_file = io.open(filename, 'wb')
        self.output_sock = sock.makefile('wb')

    def write(self, buf):
        self.output_file.write(buf)
        self.output_sock.write(buf)

    def flush(self):
        self.output_file.flush()
        self.output_sock.flush()

    def close(self):
        self.output_file.close()
        self.output_sock.close()


# Connect a socket to a remote server on port 8000
sock = socket.socket()
sock.connect(('my_server', 8000))

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

    # Construct an instance of our custom output splitter with a filename
    # and a connected socket
    my_output = MyOutput('output.h264', sock)

    # Record video to the custom output (we need to specify the format as
    # the custom output doesn't pretend to be a file with a filename)
    camera.start_recording(my_output, format='h264')
    camera.wait_recording(30)
    camera.stop_recording()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.