Grava nomes de arquivos de imagens individuais em vídeo de saída FFmpeg

6

Estou usando o FFmpeg para ler em uma série de imagens individuais e exibi-las como um vídeo.
O resultado é um intervalo de tempo de capturas de tela de um website em intervalos de 1 minuto.

Agora, gostaria de gravar o tempo de captura original de cada imagem no vídeo resultante usando o comando drawtext. O tempo de captura está disponível no nome de cada imagem. Mas eu não estou conseguindo encontrar alguma opção para drawtext para acessar os nomes de arquivos das imagens de entrada.

Uma alternativa seria acessar a data de criação de cada imagem a partir de um texto de desenho (também não consigo encontrar uma maneira de fazer isso). Mas eu definitivamente prefiro acessar o nome do arquivo, pois isso me daria mais opções para formatar o texto.

Existe uma maneira de fazer isso?
Seria ótimo se qualquer solução proposta funcionasse no Windows também.

    
por Jpsy 15.02.2014 / 01:28

2 respostas

2

Você não poderá fazer isso em uma linha, pois o filtro drawtext de ffmpeg não é tão avançado.

Você precisará pré-processar as imagens com antecedência com alguns scripts.

Algo parecido com um script simples:

for i in *.png; do 
    time = $(echo $i | cut -d . -f 1)
    ffmpeg -i $i -vf "drawtext=text=$time" mod-$time.png
done

Você pode usar os arquivos mod * .png para criar seu vídeo.

    
por 15.02.2014 / 12:21
2

A resposta do Znuff é ótima (aceita e ganha) e abriu caminho para minha própria solução. Como é específico do Unix e eu tive que trabalhar no Win, aqui está a minha solução para o Windows 7 e acima:

Eu usei dois arquivos em lote (Master.cmd e Slave.cmd) para percorrer todas as imagens e gravar os nomes dos arquivos nelas.

Master.cmd:

forfiles /p "MyImagesSubPath" /m "2014-02-15*.png" /c "cmd /c ..\Slave.cmd @file @fname

Slave.cmd:

ffmpeg -i "%~1" -vf "crop=1072:1192:24:101, drawtext=text=%~2: fontcolor=white: fontsize=60: box=1: [email protected]: x=50:y=50: fontfile=c\:\\Windows\\Fonts\\myfont.ttf" "mod_%~1"

Explicação:

É necessário usar dois lotes por vários motivos:
1. O parâmetro / c de forfiles aceita apenas uma linha de comando de tamanho limitado (253 caracteres)
2. Aninhar o comando FFmpeg no parâmetro forfiles / c exigiria um nível insano de caráter excaping.

O filtro de nome de arquivo "2014 -... png" no Master.cmd é usado para evitar que o loop reprocesse sua própria saída (chamada "mod _... png") em um loop infinito. Você deve adaptar essa string de filtro para corresponder às suas imagens de origem.

O lote escravo é executado dentro do subdiretório "MyImagesSubPath" abaixo do diretório de lotes (isto é, onde você tem que colocar suas imagens de origem). Slave.cmd recebe o nome do arquivo com e sem extensão (.png) como seus dois parâmetros.

O parâmetro filename sem extensão é usado como texto a ser gravado na imagem. As imagens resultantes são armazenadas com o prefixo "mod_" no mesmo caminho das imagens originais. Os nomes dos arquivos podem conter espaços em branco.

    
por 17.02.2014 / 18:22