O uso do parâmetro -ss
com o filtro select
funcionaria.
Algo parecido com:
ffmpeg -ss 180 -i yourvideo.mp4 -vf select="eq(pict_type\,I)" -vframes 1 thumbnails.jpeg
Eu uso o FFmpeg para extrair um keyframe no terceiro minuto. Isso significa que é o frame 3 * 60 * 25 th (assumindo 25 FPS). Agora, muitas vezes esse quadro não é um quadro-chave.
Eu quero extrair um quadro mais próximo ao quadro acima, mas garantir que seja um quadro-chave. Isso significa que o quadro pode ocorrer alguns segundos antes ou depois do terceiro minuto do vídeo.
Eu olhei em todos os lugares sem qualquer sorte! Eu estou fazendo isso no Linux, então se você estiver usando um FFmpeg com algo especialmente instalado ou empacotado, me avise!
O uso do parâmetro -ss
com o filtro select
funcionaria.
Algo parecido com:
ffmpeg -ss 180 -i yourvideo.mp4 -vf select="eq(pict_type\,I)" -vframes 1 thumbnails.jpeg
Se você assumir que o quadro I mais próximo de 00:03:00 aparece antes desse timestamp, você terá que fazer algumas suposições, já que o comprimento do GOP (o número de quadros entre cada um I-frame) não é o mesmo para cada vídeo. Se você conhece o tamanho do seu GOP, por exemplo 125 quadros, então inicie 5 segundos antes disso, às 00:02:55, por exemplo.
Observe que isso não precisa ter um tamanho fixo. Bons codificadores colocam um quadro I em cortes de cena em vez de pontos fixos para obter melhor compactação e confiabilidade.
Então, vamos mudar a entrada pela quantidade de tempo que calculamos antes, usando -itsoffset
.
Especificamos o filtro select
para obter apenas quadros I e -vframes
para receber apenas um quadro. Por fim, escreva isso em um arquivo .jpg
.
ffmpeg -itsoffset -00:02:55 -i in.mp4 -filter:v select='eq(pict_type\,I)' -vframes 1 out.jpg
Eu testei isso com um vídeo que originalmente tem um quadro P às 00:03:00, e recebi o 13º quadro depois disso, que é o começo de uma nova cena - um quadro I.
Tags ffmpeg