2016-06-16 60 views
5

L'obiettivo finale è elaborare i dati RGB di un video.Qual è la struttura di un flusso video?

Sto provando a leggere i byte di un file che ho creato usando ffmpeg.

ffmpeg -video_size 100x100 -framerate 20 -f x11grab -i :0.0 \ 
    -c:v rawvideo -pix_fmt rgb24 -video.nut 

ho scritto una node script per contribuire a rendere più facile la lettura dei dati binari se ne avete bisogno. L'uscita del mio file corrente è:

Hex Binary Row 
47 01000111 0 
40 01000000 1 
11 00010001 2 
10 00010000 3 
03 00000011 4 
00 00000000 5 
00 00000000 6 
00 00000000 7 
68 01101000 8 

vedo the spec for a .nut, ma non riesco a capirlo. Mi piacerebbe essere in grado di analizzare i dati RGB per ogni frame in modo che mi rimane una matrice RGB per ogni "immagine" nel flusso video. Grazie!

+0

eseguire ffprobe su video.raw e postare l'output – szatmary

+0

@szatmary ffprobe restituisce un errore (https://gist.github.com/mjpuser/edb891d0af2680e657249cf6fd96f7ee). Ho compilato ffmpeg in base a https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu – Matt

+0

Sembra che ffmpeg non supporti il ​​muxing video non elaborato in TS. ffplay non lo riprodurrà. – Mulvya

risposta

1

Se sei ok con l'analisi video grezzo quindi utilizzare

ffmpeg -video_size 100x100 -framerate 20 -f x11grab -i :0.0 
     -c:v rawvideo -pix_fmt rgb24 -f rawvideo video.rgb 

La struttura della uscita sarà

R G B R G B R G B ... 

Così ogni tre tripletta byte rappresenta un pixel in ordine di scansione da sinistra a destra , Dall'alto al basso. Quindi, per un frame 100x100, il 301st byte è il valore R per il primo pixel della seconda riga. Il 30000 ° byte è il valore B per il pixel nell'angolo in basso a destra. Quindi i successivi 30K byte rappresentano il fotogramma successivo e così via.

Questo è un flusso video non elaborato, pertanto non sono presenti metadati del contenitore o incapsulamento del frame. Solo un flusso indifferenziato di valori dei canali pixel.

+0

Grazie a @Mulvya. Puoi indicarmi un punto nei documenti in cui si dice che rawvideo è strutturato in questo modo? – Matt

3

Personalmente, mi piace la risposta di @ Mulvya. Il formato .rgb è molto più semplice. Tuttavia, se si passa questo file, è necessario sempre includere note con esso (ad esempio: larghezza, altezza, framerate previsto, ecc.), Altrimenti è un mare di byte senza alcuna idea di dove fermarsi per fotogramma.

Per quanto riguarda il .nut formato come lei ha chiesto in precedenza ...

Ogni fotogramma video sarà classificato come un fotogramma chiave (in quanto si tratta di un'immagine completa non compresso).

  • Prima trovare la sezione dei dati per i vostri fotogrammi chiave ... Se vuoi inserire una sequenza di codice di avvio in questo modo:
    4E 4B E4 AD EE CA 45 69.

  • per essere sicuri che questa è la sezione fotogrammi chiave di dati, il successivo byte vengono sempre impostate come:
    06 00 00 00 00 00 00 03.

  • Poi il successivo byte contengono Flags e byte totali utilizzati per questo fotogramma chiave (es: per un'immagine 100 x 100 x 3). Diventa complicato perché ora devi controllare a livello di bit non solo a livello di byte ... La versione breve di questa storia è (per un'immagine 100 x 100) è solo saltare i successivi 4 byte che dovrebbero essere 00 81 EA 30 per arrivare a i 30 000 byte di dati RGB. e:

    (a) Primo fotogramma saltare 4 byte (deve essere 00 81 EA 30) + estrarre i seguenti 30 000 byte.

    (b) Questo porta a un altro codice del keyframe: 4E 4B E4 AD EE CA 45 69. Seguito da 15 byte in grado di saltare (di cui l'ultimo è 30) e ottieni i 30K di dati RGB dell'immagine.

    (c) Per tutti gli altri fotogrammi ripetere il punto (b), per cui è: salta byte di codice di inizio + Skip successivo byte + Estrarre prossimi byte per un'immagine. Ripeti fino alla fine.

    • PS: Come nota finale ... Questi 4 byte sono solo 4 a causa dei bit totali necessari per la definizione (flag ecc.) Di un'immagine 100 x 100. Altri bit verranno utilizzati per un'immagine di dimensioni maggiori.In tal caso, si analizzano realmente i singoli bit, anche i bit finali prima che i dati di un frame diano sempre la dimensione dei byte richiesti per l'estrazione delle immagini. Fammi sapere se hai bisogno di quelle informazioni.

risposta Old

non riesco a capire cosa formattare il carico utile è in. Ho controllato wikipedia per il formato video non compresso, ma che era nessun aiuto ...

-f mpegts significa forza il formato di uscita sia mpegts indipendentemente dall'estensione del file.
Quindi hai davvero il formato MPEG TS e non è mai stato il formato RAW. Quelle 3 lettere, r-a-w, nel tuo nome file sono fuorvianti.

Non riesco a verificare quale formato sia effettivamente necessario quando si dice solo "video non compresso". E 'RGB che vuoi? Conosco solo AVI e FLV come formati che supportano i frame RGB (probabilmente MOV lo può fare ma non lo ha mai provato). In anycase avete bisogno di un contenitore di per i vostri RGB i dati della struttura

AVI contenitore:

ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v rawvideo -pix_fmt rgb24 video.avi 

FLV contenitore:

ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v flashsv -pix_fmt rgb24 video.flv 


PS: Forse le informazioni in this answer possono aiutarti a decidere sul formato di output del contenitore &.

+0

Ho aggiornato la mia domanda per renderla più chiara. Ho anche cambiato il nome del file in quanto potrebbe essere fonte di confusione. – Matt

+0

Grazie per l'input. – Matt