ffmpeg: cria um filme a partir do conjunto de imagens com sobreposição parcial de carimbos (data e hora)

3

Eu tenho duas câmeras no meu jardim tirando fotos em jpeg com lapso de tempo de duas plantas que me interessam.

Um deles já tem carimbo de data e hora e não me causa problemas, eu faço um filme diário com:

cat *.jpg | ffmpeg -y -f image2pipe -i - -an -threads 4  -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

E o filme sai perfeito, com as imagens em perfeita sequência.

Quanto ao outro, o método que estou usando é um passo de dois, que eu gostaria de converter em um passo. É preciso cada foto, faz uma sobreposição em cada um, armazena em uma pasta tmp de onde o script acima faz o filme.

Funciona, mas consome muito tempo e prejudica a qualidade devido ao processo de codificação dupla.

Então, decidi dar um passo com um dos scripts abaixo:

cat *.jpg | ffmpeg -y -f image2pipe -i - -an -threads 4 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf: text="Partial filename of each image, containing date-time": [email protected]: x=7: y=7" -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

Pergunta 1: Isso funciona, mas não consigo processar o nome do arquivo para inseri-lo no filtro.

Haveria outra maneira:

find . -type f -name '*.jpg' -exec TEST=$'{}' \; -exec cat {} \; | ffmpeg -y -f image2pipe -i - -an -threads 4 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf: text=$TEST: [email protected]: x=7: y=7" -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

Como você pode ver, a intenção é obter o nome do arquivo na variável, processá-lo e usá-lo no filtro.

Questão 2 Existem dois problemas aqui. A primeira é que as imagens não estão sendo classificadas por nome de arquivo, portanto, fora do tempo. A segunda é que 'find' não está funcionando como eu esperava com dois comandos exec.

Então, isso foi bastante extenso, espero que você possa ler tudo. Existe alguém capaz de ajudar, por favor?

TIA jss

    
por Jose Silva 18.03.2018 / 02:57

1 resposta

0

Eu não conheço o FFmpeg, e eu não o tenho, então não posso testar isso. Mas você diz cat *.jpg (e, por exemplo, echo *.jpg ) dar-lhe os arquivos na ordem correta. Nesse caso, você deve ser capaz de fazer o que quiser com

for f in *.jpg
do
   ffmpeg -y … args … text="$f": … more args … -loglevel info "../video_test.mp4" < "$f"
done

ou, se você insistir em usar cat :

for f in *.jpg
do
   cat "$f" | ffmpeg -y … args … text="$f": … more args … -loglevel info "../video_test.mp4"
done
    
por 20.03.2018 / 06:50

Tags