字幕重叠:如何比较字幕中的两个时间线(例如 00:18:06 与 00:16:01)并在重叠时覆盖其中一个?

字幕重叠:如何比较字幕中的两个时间线(例如 00:18:06 与 00:16:01)并在重叠时覆盖其中一个?

我有一系列 srt 文件(电影字幕),其中一些时间线在视频上相互重叠!这意味着一些时间线的显示时间比电影中长 1-2 秒,并与下一条时间线冲突!

例如:

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’ 与 ‘04’ 重叠!

我想将时间线的第一部分覆盖在前一行的第二部分上。注意不要让所有时间线互相干扰。其中一些是正确的,并且比下一条时间线短!干扰只针对其中的一些。

答案1

我问了这个问题#awk IRC一个@geirha写了以下很棒的脚本。该脚本可能对其他人有用。字幕重叠问题很常见,因为在为电影添加字幕时会出现人为错误!

假设您的时间线采用以下格式:
A --> B
C --> D

将 B 替换为 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

比较上面的代码C这样:

如果 B > C => 则运行该迷人命令来替换 B。
如果 B < C => 不执行任何操作!


将 C 替换为 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

要对文件夹中的一定数量的 srt 文件使用脚本:

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

代替xxx使用正确的脚本代码!

相关内容