Anonymous avatar Anonymous committed 6f20859

inicio

Comments (0)

Files changed (6)

+
+MYDIR=`dirname $0`
+
+FILME=Lost.S06E01-E02.HDTV.XviD-2HD.avi
+LEGENDAS=lost.s06e01-e02.hdtv.xvid-2hd.en.srt
+
+FRAMERATE=24
+WIDTH=624
+HEIGHT=352
+
+# Separa os frames do video original 
+mkdir frames
+ffmpeg -i $FILME frames/%010d.png
+
+# Processa os frames
+mkdir frames_gray
+bash $MYDIR/converte_frames
+
+# cria o template do frame de legendas
+convert $MYDIR/silent_movie_frame.jpg -resize ${WIDTH}x${HEIGHT}'!' -type Grayscale moldura_base.png
+
+# Cria os frames de legendas
+mkdir frames_legendas
+python $MYDIR/legendas.py $FRAMERATE $WIDTH $HEIGHT $LEGENDAS
+
+# Cria os symbolic links com a sequencia de frames finais:
+mkdir links
+python $MYDIR/reordena.py
+
+# Gera o filme final
+ffmpeg -qscale 1 -r $FRAMERATE -i links/%10d.png resultado.mpg
+

converte_imagens.sh

+cd frames
+for img in *.png
+do
+  
+  #nr=`expr 0 + ${img/.png/}`
+
+  gray=../frames_gray/$img
+  if [ ! -e $gray ]
+  then
+      echo A gerar $gray
+      convert $img -type Grayscale -blur 5 -blur 5 $gray
+      sleep 0.1
+  fi
+
+  echo A apagar $img
+  rm $img
+done
+
+import os
+import sys
+
+# recebe uma pasta com milhares de ficheiros de frames, com o formato "numero.png"
+# mostra os intervalos que estão contidos lá
+
+nomes = os.listdir(sys.argv[1])
+nomes.sort()
+
+def numero(nome):
+    p=nome.find(".")
+    return int(nome[0:p])
+
+pos = 0
+while pos < len(nomes):
+    nr = numero(nomes[pos])
+
+    pos2 = pos+1
+    while pos2 < len(nomes) and numero(nomes[pos2]) == nr + pos2-pos:
+        pos2+=1
+
+    if pos2 == pos+1:
+        print nr
+    else:
+        print nr,"-",numero(nomes[pos2-1])
+
+    pos = pos2
+# coding: utf-8
+
+import sys, os, subprocess, shutil
+
+import re
+
+re_tags = re.compile('<[^>]*>')
+re_separador = re.compile("\r?\n\r?\n")
+re_tempo = re.compile('(\d+):(\d+):(\d+),(\d+)')
+
+MAX_ALTURA= 4 # numero maximo de linhas por ecran
+MAX_LARGURA = 30 # tamanho maximo duma linha em caracteres
+
+FONTE = "Times-Roman"
+FONTSIZE = 40
+SEPARACAO = 10 # pixeis
+
+WIDTH=None
+HEIGHT=None
+
+# ito vou receber como argumentos do programa:
+FRAMERATE=None # frames por segundo
+DURACAO_LEGENDA_FIXO = 1 # segundos
+DURACAO_LEGENDA_POR_LINHA = 0.5
+
+def erro(mensagem):
+    print mensagem
+    sys.exit(1)
+
+# converte uma string do gênero  "01:21:17,000" para um valor double de segundos
+def parse_tempo(str):
+    match = re_tempo.search(str.strip()) or erro("tempo errado "+str)
+    (h,m,s,ms) = match.groups()
+    return 3600 * int(h) + 60 * int(m) + int(s) + float(ms) / 1000
+
+# faz o parse do ficheiro indicado e retorna uma lista de tuplos (tempo_inicial, tempo_final, texto_legenda)
+# Conidera que é um ficheiro tipo "srt" que tem vários registos separados por uma linha vazia
+# Cada registo é multilinha. A primeira tem um número sequencial, a segundo o intervalo de tempo, e as restantes o texto da legenda
+# 1044
+# 01:17:58,199 --> 01:18:03,204
+# If you ever want a consult...
+# Just, uh, give me a call.
+def parse_legendas(file):
+    f = open(file, "r")
+    tudo = f.read()
+
+    # os registos, que são separados por uma linha vazia
+    partes = re_separador.split(tudo.strip())
+
+    last_id = -1
+
+    resultado = []
+
+    for parte in partes:
+
+        linhas = parte.split("\n")
+        len(linhas) < 3 and erro("erro na parte "+parte)
+
+        id = int(linhas[0])
+
+        if last_id != -1 and id != last_id + 1:
+            erro("erro na sequencia de ids "+str(id))
+
+        last_id = id
+
+        linha = linhas[1]
+        separador = "-->"
+        p = linha.find(separador)
+        if p == -1: 
+            erro("erro na linha do tempo "+linha[1])
+
+        inicio = parse_tempo(linha[0:p])
+        fim = parse_tempo(linha[p+ len(separador) : ])
+
+        texto = "\n".join(linhas[2 :])
+
+        resultado.append( (inicio, fim, texto) )
+        #print id,inicio, fim, texto
+
+    return resultado
+
+# cria uma imagem com as linhas de legenda, e grava no ficheiro indicado
+def cria_imagem_legenda(linhas, ficheiro):
+    y= (HEIGHT - len(linhas) * FONTSIZE - (len(linhas)-1) * SEPARACAO) / 2
+
+    # crio a partir do ficheiro que tem a moldura:
+    cmd = ["convert", "moldura_base.png", "-font", FONTE, "-weight", "2", "-pointsize", str(FONTSIZE), "-fill", "white"]
+
+    for linha in linhas:
+        cmd = cmd + ["-draw", "gravity North text 0,"+str(y)+" '"+linha.replace("'","\\'")+"'"]
+
+        y += FONTSIZE + SEPARACAO
+
+    # o ficheiro criado deve ser grayscale, sem alpha channel... par ficar equivalente aos outros frames do filme
+
+    # crio primeiro um jpg para ficar sem transparencia...
+    ficheiro_aux = ficheiro + ".jpg"
+    cmd = cmd + ["-blur", "5", "-blur", "5", ficheiro_aux]
+    subprocess.Popen(cmd).wait()
+
+    # e depois converto no ficheiro pedido (que deve ser um png...)
+    subprocess.Popen(["convert", ficheiro_aux,"-type","Grayscale", ficheiro]).wait()
+    os.remove(ficheiro_aux)
+
+    
+# Cria uma série de frames para mostrar uma legenda. O tempo que a legenda vai ficar depende
+# do número de linhas que ela tem.
+#
+# Parametros:
+# frame é o nr do frame do filme original onde quero inserir a legenda
+#  texto é uma string com o texto completo da legenda. Esse texto pode ser dividido em varios se for grande de mais!
+# legendas_dir é a pasta onde vou guardar os frames criados, que vão ter o formato "frame-numero.png" em que frame é o valor que recebi, e numero é um número sequencial
+#
+def cria_legenda(frame, texto, legendas_dir):
+    linhas = []
+
+    # remove tags, como "<i>"
+    texto = re_tags.sub("", texto)
+
+    # separa as linhas mais compridas que max_largura
+    for linha in texto.split("\n"):
+        linha = linha.strip()
+        while len(linha) > MAX_LARGURA:
+            p = linha.rfind(" ", 0, MAX_LARGURA)
+            if p == -1: 
+                p = MAX_LARGURA
+
+            linhas.append(linha[0:p])
+            linha = linha[p:].strip()
+        linhas.append(linha)
+
+    conta = 0
+    while linhas:
+        firstf = legendas_dir + "/%010i-%06i.png" % (frame, conta)
+        conta +=1
+
+        duracao = DURACAO_LEGENDA_FIXO + len(linhas[0: MAX_ALTURA]) * DURACAO_LEGENDA_POR_LINHA
+
+        # o numero de frames que vai durar:
+        frames_legenda = int(duracao* FRAMERATE)
+
+        # cria o primeiro ficheiro
+        cria_imagem_legenda(linhas[0: MAX_ALTURA], firstf)
+
+        # se o numero de linhas for grande demais, divido em partes!
+        linhas=linhas[MAX_ALTURA:]
+
+        # os restantes frames são iguais ao primeiro portanto uso sym links
+        for i in range(1, frames_legenda):
+            f = legendas_dir + "/%010i-%06i.png" % (frame, conta)
+            conta +=1
+
+            subprocess.Popen(["ln", "-sf", os.path.basename(firstf), f]).wait()
+            #shutil.copy(firstf, f)
+
+if __name__ == '__main__':
+
+    # teste:
+    # printf "s'dkf jsdf dsjklf sdgla\nadeus"| python ../legendas.py 12 5 624 352
+    #    frame = int(sys.argv[1])
+    #    FRAMERATE = int(sys.argv[2])
+    #    WIDTH = int(sys.argv[3])
+    #    HEIGHT = int(sys.argv[4])
+    #    texto = sys.stdin.read().strip()
+    #    cria_legenda(frame, texto, "frames_legendas")
+
+    FRAMERATE = int(sys.argv[1])
+    WIDTH = int(sys.argv[2])
+    HEIGHT = int(sys.argv[3])
+    ficheiro_legendas = sys.argv[4]
+
+    legendas = parse_legendas(ficheiro_legendas)
+    for legenda in legendas:
+        inicio, fim, texto = legenda
+
+        meio = (inicio + fim )/2
+        frame = int(meio * FRAMERATE)
+
+        if frame > 71832:
+            print "frame",frame,"texto","("+texto+")"
+
+            cria_legenda(frame, texto, "frames_legendas")
+import os
+
+files={}
+nomes=[]
+
+for dir in ["frames_gray","frames_legendas"]:
+    for nome in os.listdir(dir):
+        file = dir +"/"+nome
+        nomes.append(nome)
+        files[nome]=file
+
+
+nomes.sort()
+
+conta_origem=0
+conta_destino=0
+
+CORTE_PERCENT = 12 # em percentagem
+corta = int(100/CORTE_PERCENT)
+
+for nome in nomes:
+    conta_origem +=1
+    
+    # para ficar mais rapido, remove alguns dos frames:
+    if conta_origem % corta == 0:
+        # nao uso este frame
+        continue
+
+    origem="../"+files[nome]
+
+    destino="links/%010d.png" % (conta_destino)
+    conta_destino +=1
+
+    print "ln -s "+origem+" "+destino
+
+    #if conta_destino >= 9120 and conta_destino < 10950:
+    #    destinox = "links/%010d.png" % (conta_destino - 9120)
+    #    print "ln -s "+origem+" "+destinox
+
Added
New image
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.