web-dev-qa-db-fra.com

Chevauchement des sous-titres: comment comparer deux chronologies dans les sous-titres (par exemple 00:18:06 vs 00:16:01) et en écraser une si elle se chevauche?

J'ai une série de fichiers srt (sous-titres de films) dont certaines chronologies se chevauchent sur la vidéo! Cela signifie que certaines chronologies sont affichées environ 1 à 2 secondes de plus qu'elles ne le sont dans le film et sont en conflit avec les suivantes!

par exemple:

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' chevauche '04'!

Je veux écraser la première partie des lignes de temps sur la 2ème partie de leur ligne précédente. Veillez à ce que toutes les chronologies n'interfèrent pas les unes avec les autres. certains d'entre eux sont corrects et plus courts que leur prochaine chronologie! L'ingérence ne concerne que certains d'entre eux.

2
mini

J'ai posé cette question sur # awk IRC an @ geirha a écrit les excellents scripts ci-dessous. Le script peut être utilisable par d'autres personnes. Le problème de chevauchement des sous-titres est courant en raison d'une erreur humaine lors du sous-titrage d'un film!

Supposons que vos délais soient au format ci-dessous:
A --> B
C --> D

Remplacement de B par 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

Le code ci-dessus compare [~ # ~] b [~ # ~] et [~ # ~] c [ ~ # ~] de cette façon:

Si B> C => alors exécutez cette charmante commande pour remplacer B.
Si B <C => Ne rien faire!


Remplacement de C par 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

Pour utiliser des scripts sur une certaine quantité de fichiers srt dans un dossier:

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

Remplacez xxx par les bons codes de script!

2
mini