我有一系列 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使用正确的脚本代码!