Extraindo o índice de quadros chave de um vídeo usando o ffmpeg

8

Estou usando o ffmpeg para extrair quadros-chave de um vídeo. Este é o comando:

ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

Como posso obter o índice de cada quadro chave extraído no vídeo? Por exemplo, para o primeiro quadro I, o índice seria 0, para o segundo, seria 24, etc.

    
por Faten Khalifa 04.03.2015 / 01:52

2 respostas

14

Como @dstob mencionado, você pode usar ffprobe para obter os quadros-I e suas informações associadas. ffprobe vem com algumas das compilações estáticas na página de download e também podem ser criadas a partir da origem.

Isto supõe que você esteja no Linux / Unix:

Extrair quadros e tipos de quadros

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1

O comando grep filtra linhas com I e conta seu índice (usando a opção -n ). O comando cut seleciona apenas a primeira coluna da saída (o índice). Observe que esse índice é baseado em 1, não em 0.

Renomeie os arquivos de saída com base no índice

Você pode, na verdade, canalizar esses índices para uma lista:

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt

Em seguida, faça uma lista de todas as miniaturas também:

ls -1 thumbnails*.jpeg > thumbnails.txt

Depois cole os dois juntos:

paste thumbnails.txt frame_indices.txt > combined.txt

A lista agora contém o nome da miniatura e do índice. Execute uma renomeação com base nisso:

while read -r thumbnail index; do
  newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
  mv -- "$thumbnail" "thumbnail-$newIndex.jpeg"  # rename file
done < combined.txt

As opções acima renomearão thumbnail-01.jpeg para thumbnail-0.jpeg . Observe que não há preenchimento com zero no índice de saída. Se você quiser zerar para, digamos, 5 dígitos, use printf :

newIndex=$(printf '%05d' $(echo $index - 1 | bc))

No Windows, você faria exatamente o mesmo com ffprobe , mas analisaria a saída de maneira diferente. Não tenho ideia de como renomear lá.

    
por 04.03.2015 / 21:24
0

Se você deseja usar o FFMPEG como declarado originalmente, é possível listar todas as listagens parciais ou parciais, bem como criar jpg com o seguinte:

ffmpeg.exe \
  -i "C:\Users\UserName\Desktop\jpegs and list\VideoName.mp4" \
  -t 15 \
  -vf select="eq(pict_type\,PICT_TYPE_I)" \
  -vsync 2 \
  -s 160x90 \
  -f image2 thumbnails-%02d.jpeg \
  -loglevel debug 2>&1| for /f "tokens=4,8,9 delims=. " %d in ('findstr "pict_type:I"') do echo %d %e.%f>>"keyframe_list.txt"

Remova -t 15 sem limite de tempo ou alteração para se adequar. Remova -s 160x90 -f image2 thumbnail-%02d.jpeg ou altere para se adequar à remoção de miniaturas.

    
por 07.10.2016 / 07:32

Tags