Miniaturas de vídeos usando o ffmpeg

3

Estou procurando uma forma curta e fácil de criar uma série de miniaturas para qualquer arquivo de vídeo. Estou quase lá usando ffmpeg, aqui está o que eu tenho:

ffmpeg -i /tmp/video.avi -r 1 -ss 60 -r 1 foo-%03d.jpeg'

O único problema é que isso leva um tiro a cada segundo e eu gostaria de fazer isso a cada minuto ou mais. Tentei definir o valor -r como 1/60 ou .02 sem sucesso.

Para referência, aqui está o script antigo que eu estava usando, que só funcionava para alguns arquivos:

#!/bin/bash
# grab a screenshot every 60 seconds
file=$1
orig_dir='pwd'
mins='exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | grep --only-matching '[0-9]*''
dir="$file-screenshots"
mkdir "$dir"
cd "$dir"
mplayer -vo png -vf screenshot -sstep 60 -frames $mins -ao null "../$file"
cd "$orig_dir"

Isso não precisa estar na linha de comando, é só que sempre acaba sendo mais fácil.

    
por Michael Lenzen 29.04.2010 / 07:24

1 resposta

3

Veja o ffmpeg manpage . Você quer -vframes :

-vframes number
Set the number of video frames to record.

Veja também este exemplo de alguém fazendo a mesma coisa. A mensagem original observa que -r parece não funcionar corretamente com argumentos menores que um. Em vez disso, a sugestão é usar esse tipo de linha de comando para pegar um quadro (onde X é algum tempo para procurar no arquivo):

ffmpeg -ss X -i input.movie.file -an -vframes 1 ouput.png

Em seguida, use o shell script para fazer um loop e gerar automaticamente o X com base em (a) quantos quadros você deseja capturar e (b) por quanto tempo o vídeo está. Como seu antigo script de exemplo já encontra (b), (a) é a única entrada necessária:

# generate NFRAMES frames in a movie 90 minutes long

mins=$(exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | grep --only-matching '[0-9]*')
dir="$file-screenshots"
mkdir "$dir"

for i in $(seq 1 $NFRAMES);
do
  ffmpeg -ss $(echo "$i * $mins" | bc -l) -i "$file" -an -vframes 1 "$dir/$i.png";
done
    
por 29.04.2010 / 19:22