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 framerate
significhi 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 30
avrebbe 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