Criar miniatura do vídeo


11

Como posso fazer uma captura simples de um vídeo. De preferência a partir da linha de comando?

Idéia: tire 9 fotos instantâneas por 9 vezes até colocadas (na linha do tempo) e salve-as como JPGs

Exemplo:

Movie length = 10 min
T1= snapshot of 1 min
T2= snapshot of 2 min
......
T9= snapshot of 9 min
   |   |
 T1| T2| T3
---+---+---
 T4| T5| T6
---+---+---
 T7| T8| T9
   |   |

Qual é o melhor programa para fazer isso? Existem programas de código aberto?

Respostas:


5

O ffmpeg é uma excelente ferramenta de código aberto para manipular vídeos, incluindo a extração de quadros.

Para extrair um único quadro de um carimbo de data / hora específico, você pode usar comandos como

ffmpeg -i video.avi -r 1  -t 00:01:00 -f image2 image%05d.png

-r é framerate. Você também pode usar comandos como

ffmpeg -i video.avi -r 1/1440 -f image2 image%05d.png

para obter um quadro a cada minuto (assumindo vídeo de 24FPS). O% 05d significa que o número ordinal de cada imagem em miniatura deve ser formatado usando 5 dígitos.

Se você quiser combinar imagens como montagem (sua grade), poderá usar o imagemagick após extrair os quadros usando ffmpeg.



1

O vcsi é uma ferramenta de linha de comando escrita em Python que pode ser usada para criar uma grade de instantâneos de 3 por 3 com o seguinte comando:

vcsi -g 3x3 video.mkv -o output.jpg

0

Meu caso de uso é apenas uma miniatura de um vídeo, apenas um único arquivo para usar como um <video>pôster de tag. Então, qual seria uma maneira rápida de fazer isso?

Com ffmpeg, você pode fazer isso:

ffmpeg -ss 123 -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

Isso lhe dará o quadro próximo ao segundo 123dos video.mp4salvos como poster.jpg.

O problema, como você pode ver, é que precisamos saber qual é o segundo certo.

Para manter nossas dependências baixas, usaremos o próprio ffmpeg para isso:

# Get the time as h:m:s (non-padded)
l=$(ffmpeg -i video.mp4 2>&1 | grep Duration: | sed -r 's/\..*//;s/.*: //;s/0([0-9])/\1/g')
# Convert that into seconds
s=$((($(cut -f1 -d: <<< $l) * 60 + $(cut -f2 -d: <<< $l)) * 60 + $(cut -f3 -d: <<< $l)))
# Get frame at 25% as the thumbnail
ffmpeg -ss $((s / 4)) -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

25% do vídeo parece uma escolha comum, mas você pode fazer 33% ou 50% também.

Aqui está um script que faz isso .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.