ffmpeg - imagens de vídeo em seções diferentes e numeradas de forma incremental

0

Eu estou usando o ffmpeg para extrair imagens estáticas de um vídeo. A partir de um determinado momento, por uma determinada duração usando os parâmetros -ss e -t.

ffmpeg -ss 00:10:01 -t 2 -i /Volumes/OO_8/VideoSource.mkv -qscale:v 2 -start_number  /Users/Olivier/Pictures/ScreenCaptures/ViewsOfNature-%4d.jpeg

(Eu começo com o timestamp / duration primeiro para que o ffmpeg inicie o demux nesse ponto.)

No entanto, eu quero usar vários pontos de partida (por exemplo, às 00:01:12, extrair as imagens por 2 segundos, às 00:11:00 minutos, extrair as imagens por 4 segundos, etc.). isso manualmente, substituindo o registro de data e hora e a duração e movendo as imagens de saída de cada vez, mas, idealmente, quero inserir os registros de data e hora de uma só vez e não sobrescrever as imagens de saída. Existe uma maneira de fazer isso? Talvez com um arquivo externo com os timestamps / durações?

Eu sou novo para isso, e prefiro fazê-lo com ffmpeg apenas, não use bash.

OlivierOO
fonte

Respostas:

1

Eu não vejo uma maneira de fazer isso com ffmpeg facilmente. Há um muxer de segmento, mas você não pode definir a duração dos segmentos.

Não há nada que o impeça de fazer assim, o que acredito ser bastante simples. Basta criar um arquivo de texto contendo uma lista separada por vírgulas de pontos iniciais e durações:

$ cat split.txt
00:01:05,5
00:06:10,2
00:08:25,1

E então no Bash:

count=1
while read -r -d ',' start duration; do
  ffmpeg -ss "$start" -i input.mp4 -t "$duration" "$count-output-%04d.jpg"
  (( count++ ))
done < split.txt

Isto criará arquivos de saída começando com um número único (1, 2, 3,…).

slhck
fonte
Eu tentei também com 00:01:02.01 (o último sendo o quadro) e que parecia resolvê-lo, mas ainda assim, às vezes, um timestamp é recusado. Brincar com os valores parece resolver (aumentar ou diminuir) parece resolvê-lo. Eu suspeito que é com ffmpeg não encontrar essa posição no arquivo de origem. Eu tentei posições aleatórias até agora. Vai tentar com posições reais que eu preciso e voltar a isso.
OlivierOO
Acho que foi um problema de leitura de formato / arquivo com o Bash. O timestamp é HH:MM:SS.msec e isso deve sempre trabalhos. Note que não são frames. Quando não encontrar um quadro no horário especificado, ele terá o próximo.
slhck
Agora tenho: 00:01:02.000 1.5 00:10:06.000 2 00:12:01.030 2 00:16:06.050 1 Isso funciona. (O valor de 1,5 para a duração na última linha que tentei mais tarde, que funciona também.)
OlivierOO