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: