Subtitle Overlapping: Como comparar duas linhas de tempo em legendas (por exemplo, 00:18:06 vs 00:16:01) e sobrescrever uma delas se estiver sobreposta?

2

Eu tenho uma série de arquivos srt (legendas de filmes) que algumas de suas linhas de tempo se sobrepõem umas às outras no vídeo! Isso significa que algumas linhas de tempo são exibidas cerca de 1 a 2 segundos a mais do que no filme e entram em conflito com as próximas!

por exemplo:

1
00:00:01.000 --> 00:00:07.000
The following content is provided

2
00:00:04.000 --> 00:00:10.000
under a Creative Commons license.

'07 'se sobrepõe a' 04 '!

Eu quero sobrescrever a primeira parte das linhas do tempo na segunda parte da linha anterior. Tenha cuidado para que todas as linhas do tempo não interfiram umas nas outras. alguns deles estão corretos e mais curtos do que a próxima linha do tempo! A interferência é apenas para alguns deles.

    
por mini 15.08.2013 / 20:26

1 resposta

2

Eu fiz esta pergunta em #awk IRC e @ geirha escreveu os grandes scripts abaixo. O script pode ser usado por outras pessoas. Problema de sobreposição de legendas é comum devido a erro humano durante a legendagem de um filme!

Suponha que suas linhas de tempo estejam no formato abaixo:
A --> B e C --> D

Substituindo B por C:

gawk '
  BEGIN {
    RS = "";
    OFS = FS = "\n";
    getline;
    n = split($0, prev_rec);
    split($2, prev_time, / --> /);
  }
  {
    split($2, a, / --> /);
    if (a[1] < prev_time[2])
      prev_rec[2] = prev_time[1]" --> "a[1];
    for (i=1;i<=n;i++)
      print prev_rec[i];
    printf("\n");
    n = split($0, prev_rec);
    split($2, prev_time, / --> /)
  }
  END {
    print
  }' SUBTITLE.srt > RESULT.srt

O código acima compara B e C desta forma:

Se B > C = > em seguida, execute esse comando encantador para substituir B.
Se B < C = > Não faça nada!

Substituindo C por B:

gawk '
  BEGIN {
    RS="";
    OFS=FS="\n";
    prev="00:00:00"
  }
  {
    split($2,a,/ --> /);
    if
      (a[1] < prev) $2=prev" --> "a[2];
      print $0"\n"; prev=a[2]
  }' SUBTITLE.srt > RESULT.srt

Para usar scripts em uma quantidade de arquivos srt em uma pasta:

for file in *.srt
  do xxx "$file" > "$file.tmp" && mv "$file.tmp" "$file";
done

Substitua xxx pelos códigos de script corretos!

    
por mini 13.04.2017 / 14:23