2016-04-13 33 views
10

Sto registrando video con FFmpeg e mi piacerebbe che il frame rate con cui è scritto sia almeno nel campo di destra. In questo momento prendo il frame rate che il mio input pretende di avere e lo uso per impostare il frame rate (time_base) per il mio flusso video di output. Tuttavia questo a volte è molto diverso dal frame rate effettivo che sto ricevendo (ho visto uno stream che dichiarava 50 fps ma che pubblicava a 9 fps).Registrazione di video con framerate sconosciuto con FFmpeg

Quello che mi piacerebbe fare è usare un timer trascorso e contare i fotogrammi che registro per calcolare il frame rate effettivo che ho registrato quando ho finito di registrare. Sembrerebbe però che la frequenza dei fotogrammi impostata nel mio AVStream sia utilizzata in avcodec_open2 prima di scrivere qualsiasi frame. Se lo imposto in un secondo momento (ad esempio mentre scrivo frame) mentre ffplay può riprodurlo (lamentandosi che i bit di incremento del tempo sono 6 e non 4) gli altri lettori video non possono. C'è un modo per impostare il frame rate per l'intero file dopo scrivendo i frame? Se no, c'è un modo per dire ai frame stessi una sorta di timestamp o frame rate mentre sto registrando che risulterà in un file registrato valido?

+0

ciao, guarderò di più, ma volevo solo chiedere di avconv. trovato dopo una rapida ricerca su google, sembra che possa cambiare la frequenza dei fotogrammi di un file. forse potresti scrivere il file a un frame rate arbitrario e poi dopo aver rilevato il tasso reale, finire di scrivere ed eseguire avconv con la nuova velocità? solo un pensiero, non una vera risposta;) continuerà comunque a cercare. fammi sapere. – nephi12

+0

avconv è il nome binario del progetto libav. (http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even-a-difference) ha un riepilogo abbastanza decente di tutti i nomi che avevano mi sono confuso per un bel po 'di tempo. Tutto ciò che avconv dovrebbe essere possibile con le librerie che usa. – Chris

risposta

0

Il trucco sembra essere quello di utilizzare AVCodecContext time_base e AVFrame pts in un modo più intelligente di me. Se stai registrando con una frequenza di fotogrammi fissa, time_base è impostato su 1/framerate e il pts è solo un numero incrementato per il fotogramma registrato.

Invece ora avvio un timer trascorso quando inizio la registrazione e imposto time_base a 1 sulla granularità del timer (nel mio caso ha una precisione millisecondo quindi 1000). Ho impostato i frame pts sulla quantità di tempo trascorso prima che sia codificato. Questa combinazione genera un file video con un framerate variabile che viene riprodotto correttamente.

0

Chris. È necessario sviluppare un nuovo motore di scrittura del flusso video. Quindi, se si imposta la frequenza fotogrammi come [N], il motore di scrittura scrive i fotogrammi come da velocità.

  • Controllo timestamp per ogni frame quando si scrive
  • Se si dispone di meno fotogrammi di N per un secondo, è necessario effettuare fotogrammi duplicati.
  • Se si dispone di più fotogrammi di N per un secondo, è necessario eliminare alcuni fotogrammi.

Prima di scrivere, è necessario specificare il framerate esatto.

E il motore di scrittura del file video deve funzionare con framerate specificato.

È possibile implementare questo utilizzando ffmpeg.

+0

Questo sembra il meglio che si possa fare con una frequenza fotogrammi variabile, ma cosa succederebbe se fosse fissa e sconosciuta? Nel caso che io abbia presentato lo stream, rivendica 50 fps, ma in realtà è 9, quindi mentre il tuo approccio funzionerebbe, registrerei oltre 5 volte più frame di quanto avrei bisogno. Fondamentalmente, per funzionare correttamente, è necessario conoscere il frame rate prima di iniziare. – Chris