terça-feira, 15 de julho de 2014

Script para remover vinhetas de vídeos utilizando FFmpeg

Olá pessoal. Hoje vou mostrar um script para remover vinhetas de vídeos. Para vídeos de seriado onde todo episódio tem uma vinheta no inicio do vídeo e outra no final além de ser um pouco cansativo assistir essas vinhetas em todos os episódios se você remove-las o seu vídeo final irá ocupar menos espaço em disco. Eu fiz esse processo nos episódios do Naruto Shippuuden que minha filha de 10 anos está acompanhando e eu não aguentava mais assistir a mesma vinheta a cada episódio novo que ela assistia, então resolvi cortar as vinhetas e garantir mais ação e diversão para mim e para a criança = ).

Marcando o Vídeo

Começamos marcando o vídeo que queremos com os intervalos de tempo onde aparecem as vinhetas que queremos cortar. Criamos um arquivo cuts.txt. Esse arquivo contém o formato

vídeo;-ss inicio_part1 -to fim_part1;-ss inicio_part2 -to fim_part2
linha a linha como mostrado no exemplo abaixo:

cat cuts.txt
narutoPROJECT_-_Shippuuden_197_new.mp4;-ss 0:00:00 -to 0:01:52;-ss 0:03:22 -to 0:21:05
narutoPROJECT_-_Shippuuden_198_new.mp4;-ss 0:00:00 -to 0:03:44;-ss 0:05:14 -to 0:21:05
narutoPROJECT_-_Shippuuden_199_new.mp4;-ss 0:00:00 -to 0:05:46;-ss 0:07:16 -to 0:20:05
narutoPROJECT_-_Shippuuden_200_new.mp4;-ss 0:00:00 -to 0:08:37;-ss 0:10:08 -to 0:21:05
narutoPROJECT_-_Shippuuden_201_new.mp4;-ss 0:00:00 -to 1:04:00;-ss 0:02:35 -to 0:21:05
narutoPROJECT_-_Shippuuden_202_new.mp4;-ss 0:00:00 -to 4:35:00;-ss 0:06:05 -to 0:21:05
narutoPROJECT_-_Shippuuden_203_new.mp4;-ss 0:00:00 -to 6:16:00;-ss 0:07:48 -to 0:21:05
narutoPROJECT_-_Shippuuden_204_new.mp4;-ss 0:00:00 -to 4:36:00;-ss 0:06:05 -to 0:21:05
narutoPROJECT_-_Shippuuden_205_new.mp4;-ss 0:00:00 -to 6:10:00;-ss 0:07:39 -to 0:21:05
narutoPROJECT_-_Shippuuden_206_new.mp4;-ss 0:00:00 -to 2:25:00;-ss 0:03:56 -to 0:21:05
narutoPROJECT_-_Shippuuden_207_new.mp4;-ss 0:00:00 -to 2:47:00;-ss 0:04:18 -to 0:21:05
narutoPROJECT_-_Shippuuden_208_new.mp4;-ss 0:00:00 -to 2:17:00;-ss 0:03:47 -to 0:21:05
narutoPROJECT_-_Shippuuden_209_new.mp4;-ss 0:00:00 -to 2:51:00;-ss 0:04:22 -to 0:20:05
narutoPROJECT_-_Shippuuden_210_new.mp4;-ss 0:00:00 -to 0:00:48;-ss 0:02:18 -to 0:21:05
narutoPROJECT_-_Shippuuden_211_new.mp4;-ss 0:01:30 -to 0:02:17;-ss 0:02:18 -to 0:21:05
narutoPROJECT_-_Shippuuden_212_new.mp4;-ss 0:00:00 -to 0:03:20;-ss 0:04:50 -to 0:20:05
narutoPROJECT_-_Shippuuden_213_new.mp4;-ss 0:01:30 -to 0:02:17;-ss 0:02:18 -to 0:21:05
narutoPROJECT_-_Shippuuden_214_new.mp4;-ss 0:00:00 -to 0:07:18;-ss 0:08:48 -to 0:21:05
narutoPROJECT_-_Shippuuden_215_new.mp4;-ss 0:00:00 -to 0:03:07;-ss 0:04:37 -to 0:21:05
narutoPROJECT_-_Shippuuden_216_new.mp4;-ss 0:01:30 -to 0:02:17;-ss 0:02:18 -to 0:21:05
narutoPROJECT_-_Shippuuden_217_new.mp4;-ss 0:00:00 -to 0:03:32;-ss 0:05:02 -to 0:21:05
narutoPROJECT_-_Shippuuden_218_new.mp4;-ss 0:00:00 -to 0:02:18;-ss 0:03:48 -to 0:21:05
narutoPROJECT_-_Shippuuden_219_new.mp4;-ss 0:00:00 -to 0:02:12;-ss 0:03:42 -to 0:21:05
narutoPROJECT_-_Shippuuden_220_new.mp4;-ss 0:00:00 -to 0:04:31;-ss 0:06:01 -to 0:21:05
narutoPROJECT_-_Shippuuden_221_new.mp4;-ss 0:00:00 -to 0:00:37;-ss 0:02:07 -to 0:21:05

O script irá utilizar o arquivo acima para cortar cada vídeo em duas partes que serão unidas no processo final do script. Se o seu vídeo possuir apenas uma vinheta e não duas como os meus, você ainda sim poderá corta-lo em duas partes descartando uma parte menor do vídeo.

O script

Com os vídeos devidamente marcados para fazer o corte, utilizamos o seguinte script em python.

#!/usr/bin/python
import os

def runcmd(cmd):
  os.popen(cmd)
  #print cmd

def main():
  cmd = """
  ffmpeg -y -i "%s" %s "%s"
  """

  f = open('cut.txt','r')
  lns = f.readlines()
  f.close()

  for l in lns:
    cols=l.replace('\n','').split(';')
    file = cols[0]
    cut1 = cols[1]
    cut2 = cols[2]

    #cut_file = "file '%s'" % 

    cmd_new = cmd % ( file, cut1, file.replace('.mp4','_part1.mp4'))
    runcmd(cmd_new)
    cmd_new = cmd % ( file, cut2, file.replace('.mp4','_part2.mp4'))
    runcmd(cmd_new)

    cutlist = """\
file './%s'
file './%s'
""" % (file.replace('.mp4','_part1.mp4'), file.replace('.mp4','_part2.mp4'))

    f = open('mylist.txt','w')
    f.write(cutlist)
    f.close()

    cmd_new = """ffmpeg -y -f concat -i "%s" -c copy "%s" """ % ('mylist.txt', file.replace('.mp4','_cut.mp4'))

    runcmd(cmd_new)

if __name__ == "__main__":
  main()

Coloque o script junto com o arquivo cuts.txt no mesmo diretório onde estão os vídeos e rode o script na linha de comando.

python cut.py

Voilá! No final da execução do script você terá 3 novos arquivos para cada linha do arquivo cuts.txt. O arquivo final com as vinhetas cortadas é o arquivo final _cut e você poderá apagar os arquivos _part1 e _part2 que foram utilizados para criar o arquivo final.

Postar um comentário