Frequenza dei fotogrammi durante la trasmissione dello schermo


0

Sto cercando di registrare lo schermo usando ffmpeg con il seguente comando:

ffmpeg -f x11grab -s 1366x768 -framerate 30 -i :0.0 -c:v libx264 -b:v 1000k out.mp4

che ho imparato da qui .

Ma non sono in grado di capire cosa frameratesignifichi in questo contesto.

Ecco cosa penso :

Se stessimo convertendo un set di immagini archiviate in una directory in un video come menzionato qui , un framerate di 30avrebbe significato: 'Visualizza le prime 30 immagini nel primo secondo del video, le successive 30 immagini nel secondo successivo e così fino a quando tutte le immagini sono esaurite ' .
Ad esempio, se avessimo 90 immagini, la lunghezza del video risultante sarebbe stata di 3 secondi.

Allo stesso modo, durante la screencasting, dovrebbe accadere quanto segue:

Supponendo che la mia frequenza di aggiornamento dello schermo sia di 60 Hz, 60 immagini al secondo vengono generate e archiviate in un buffer.
Ma, dato che ffmpegè stato dato un framerate di 30, prende le prime 30 immagini (immagini # 1 - # 30) dal buffer e produce 1 secondo di video, quindi prende le immagini # 31 - # 60 e produce il secondo successivo di video .
Ciò significa che, durante 1 secondo di registrazione, verrebbero prodotti 2 secondi di video.


Per testare questa teoria, ho eseguito il seguente esperimento:

Ho eseguito un cronometro grafico sullo schermo e l'ho fatto funzionare esattamente per 10 secondi, mentre simultaneamente registravo il cronometro da 1-10.

Secondo la mia teoria, o il video prodotto avrebbe dovuto essere di 20 secondi e mostrare il conteggio completo del cronometro da 1 a 10, oppure , per mantenere il tempo del video uguale al tempo di registrazione, ffmpeg avrebbe generato un video di 10 secondi e mostrato solo metà del cronometro conta da 1 a 5 (i primi 30 * 10 = 300 fotogrammi da un totale di 600 fotogrammi generati dalla scheda grafica nello stesso tempo).

Ma nessuno dei due casi precedenti si è verificato. Invece, la durata del video era di 10 secondi e il contenuto era esattamente lo stesso di come appariva lo schermo durante la registrazione, ovvero il conteggio del cronometro da 1 a 10.

Ho ripetuto lo stesso esperimento utilizzando un framerate di 10 anziché 30 e ho trovato gli stessi risultati, ovvero la durata del video di 10 secondi e il conteggio del cronometro mostrato da 1 a 10.

Quindi, cosa c'è che non va nella mia teoria?


L'unica altra teoria a cui sono stato in grado di pensare e che è coerente con le mie osservazioni è questa:

Dato che ffmpeg deve registrare a un framerate di 30 dato un flusso di input di 60 Hz, salta ogni altra immagine durante la produzione video.
Cioè, utilizza l'immagine # 1, # 3, # 5 ... # 60 per produrre 1 secondo di video.

Ma non sono sicuro che sia corretto.


La mia configurazione di sistema:

  • Sistema operativo: Ubuntu 16.04

  • versione ffmpeg:
    ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311 configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100


1
La tua seconda teoria è giusta. FFmpeg cerca di preservare le relazioni temporali, quindi un feed a 60 fps configurato per ricevere 30 fps comporterà la caduta della metà dei frame.
Gyan,

Grazie @Mulvya. Puoi dirmi un'altra cosa: le due uscite video (con fps 30 e 10) hanno la stessa dimensione del file. Capisco che ciò potrebbe essere dovuto al fatto che entrambi i video hanno lo stesso bitrate. Ma allora significa che nel video a 10 fps, i bit / fotogramma sono più e quindi, ogni fotogramma sarà più nitido (più profondità di colore) di quello a 30 fps?
Anmol Singh Jaggi,

In generale si. Ma se il bitrate è abbastanza alto e il movimento è poco frequente, non noterai una grande differenza.
Gyan,

Dal momento che ho la mia risposta, voglio chiudere la domanda. Vuoi scrivere la risposta o dovrei farlo da solo?
Anmol Singh Jaggi,

Risposte:


1

FFmpeg è un processore multimediale basato sul tempo e, come tale, si impegna a mantenere una relazione temporale dell'input se non diversamente specificato.

L' framerateopzione per il x11grabdispositivo imposta la frequenza dei fotogrammi di acquisizione. Se ci sono pochi o più frame forniti al secondo, ffmpeg duplicherà o eliminerà la differenza, rispettivamente.

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.