Taxa de quadros durante a transmissão de tela

0

Estou tentando gravar a tela usando ffmpeg com o seguinte comando:

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

que eu aprendi com aqui .

Mas não consigo entender o que framerate significa neste contexto.

Aqui está o que eu penso :

Se estivermos convertendo um conjunto de imagens armazenadas em um diretório em um vídeo, conforme mencionado aqui , uma taxa de quadros de 30 significaria - 'Exibir as primeiras 30 imagens no primeiro segundo do vídeo, as próximas 30 imagens no próximo segundo e assim por diante até que todas as imagens sejam usadas up '.
Até agora, se tivéssemos 90 imagens, o comprimento do vídeo resultante teria sido de 3 segundos.

Da mesma forma, durante o screencasting, o seguinte deve acontecer:

Supondo que minha taxa de atualização da tela seja de 60 Hz, 60 imagens por segundo serão geradas e armazenadas em um buffer.
Mas, como ffmpeg recebeu um framerate de 30, ele pega as primeiras 30 imagens (imagens # 1 - # 30) do buffer e produz 1 segundo de vídeo, depois tira as imagens # 31 - # 60 e produz as próximas segundo de video.
Isso significa que, durante 1 segundo de gravação, 2 segundos de vídeo seriam produzidos.

Para testar essa teoria, fiz o seguinte experimento:

Eu executei um cronômetro gráfico na tela e o fiz funcionar por exatamente 10 segundos, enquanto simultaneamente gravei o cronômetro de 1-10.

De acordo com minha teoria, o vídeo produzido deve ter sido de 20 segundos e ter contagem completa de cronômetro de 1 a 10, ou , para manter o tempo de vídeo igual ao tempo de gravação. > ffmpeg teria gerado um vídeo de 10 segundos e mostrado apenas metade da contagem do cronômetro de 1 a 5 (Os primeiros 30 * 10 = 300 quadros de um total de 600 quadros gerados pela placa gráfica durante o mesmo tempo ).

Mas nenhum dos dois casos acima ocorreu. Em vez disso, o tamanho do vídeo era de 10 segundos e o conteúdo era exatamente o mesmo da tela durante a gravação, ou seja, a contagem do cronômetro era de 1 a 10.

Eu repeti o mesmo experimento usando um framerate de 10 em vez de 30, e encontrei os mesmos resultados, ou seja, a duração do vídeo era de 10 segundos e a contagem do cronômetro mostrada de 1 a 10.

Então, o que há de errado com minha teoria?

A única outra teoria que eu pude pensar e que é consistente com minhas observações é esta:

Como o ffmpeg tem que gravar em um framerate de 30, dado um fluxo de entrada de 60 Hz, ele pula todas as outras imagens durante a produção de vídeo. Isto é, usa a imagem # 1, # 3, # 5 ... # 60 para produzir 1 segundo de vídeo.

Mas não tenho certeza se isso está correto.

Minha configuração do sistema:

  • SO: Ubuntu 16.04

  • versão 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

por Anmol Singh Jaggi 09.06.2016 / 20:40

1 resposta

1

O FFmpeg é um processador de mídia baseado em tempo e, como tal, se esforça para manter a relação temporal da entrada, a menos que seja instruído de outra forma.

A opção framerate do dispositivo x11grab define a taxa de quadros de captura. Se houver quadros menores ou maiores a cada segundo, o ffmpeg duplicará ou descartará a diferença, respectivamente.

    
por 11.06.2016 / 12:54