Em um ambiente de produção, quando há muitos vídeos para participar, para automatizar o processo, você pode dividi-lo em praticamente quatro componentes. Digamos que você tenha 100 vídeos de treinamento principais para começar. Estes são nomeados main001.mov, main002.mov e assim por diante até main100.mov.
- Crie seus 100 cartões de título como png ou outro formato - por meio de imagemagick / graphicsmagick / gimp / photoshop / whatever.
- Converta-os em mov files no ffmpeg. Eu mostro usando um arquivo de som estéreo preparado que é silencioso, em vez de trazer de um dispositivo nulo, mas isso seria ótimo também. Isso cria um título de 5 segundos com o aparecimento e o desaparecimento gradual:
#!/bin/bash for i in *.png; do ffmpeg -y -loop 1 -f image2 -i $i -i silence.wav -t 00:00:05 -s 1920x1080 -aspect 16:9 -acodec pcm_s24le -b:a 128k -vcodec qtrle -b:v 1024k -filter_complex 'fade=in:0:10, fade=out:110:10' -f mov ${i%%.png}.mov done
Isso cria (100) títulos mov a partir dos arquivos png fornecidos.
- Crie seu cartão final como um png e converta para mov como antes, mas agora você pode dizer:
ffmpeg -y -loop 1 -f image2 -i endcard.png -i silence.wav -t 00:00:05 -s 1920x1080 -aspect 16:9 -acodec pcm_s24le -b:a 128k -vcodec qtrle -b:v 1024k -filter_complex 'fade=in:0:10, fade=out:110:10' -f mov endcard.mov
- Concatene três conjuntos de arquivos, os dois primeiros conjuntos têm 100 arquivos cada, título e principal, e o terceiro contendo apenas um arquivo final comum. Para isso, você coloca os nomes de arquivos dos conjuntos em três matrizes e faz um loop pelos índices do array para se juntar a eles da seguinte forma:
#!/bin/bash # define the movie array movie=("main001.mov" "main002.mov" .....and so on till ... "main100.mov") #define titles array title=("title001.mov" "title002.mov" .....and so on till ... "title100.mov") #define end card array endcard=("endcard.mov") # Use for loop # get total subscripts in an array total=${#movie[*]} for (( i=0; i<=$(( $total -1 )); i++ )) do ffmpeg -i ${title[i]} -i ${movie[i]} -i ${endcard[0]} -y -filter_complex '[0:0] setsar=1/1[sarfix];[sarfix] [1:0] [2:0] concat=n=3:v=1:a=0 [v]' -map '[v]' -pass 1 -strict -2 -an -vcodec libx264 -pix_fmt yuv420p -aspect 16:9 -threads 4 -b:v 1024k -flags +loop -cmp chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 1 -trellis 0 -refs 1 -bf 3 -b_strategy 2 -coder 1 -me_range 16 -g 250 -keyint_min 75 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 ${movie[i]%%.mov}.mp4 ffmpeg -i ${title[i]} -i ${movie[i]} -i ${endcard[0]} -y -filter_complex '[0:0] setsar=1/1[sarfix];[sarfix] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1[v] [a]' -map '[v]' -map '[a]' -strict -2 -acodec aac -b:a 128k -pass 2 -vcodec libx264 -pix_fmt yuv420p -aspect 16:9 -threads 4 -b:v 1024k -flags +loop -cmp chroma -partitions +parti4x4+partp8x8+partb8x8 -mixed-refs 1 -subq 6 -trellis 1 -refs 5 -bf 3 -b_strategy 2 -coder 1 -me_range 16 -g 250 -keyint_min 75 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 ${movie[i]%%.mov}.mp4 done
O passo 1 não leva em consideração o áudio. O índice da matriz de cartão final é estático em 0, já que existe apenas um. Claro, você pode passar diretamente o nome do arquivo aqui em vez de usar array. Sarfix pode ser necessário se o filme do título ou mesmo o filme de placa final causar problemas. Eu não mostrei a opção sarfix para o filme da placa final - que exigiria setsar = 1/1 [sarfix]; [sarfix] após o mapeamento [2: 0]. Observe também que os tamanhos e taxas de bits podem não se aplicar a você.
Desta forma, você pode automatizar a concatenação de grande número de arquivos principais com títulos e cartões finais.