Перекрытие субтитров: Как сравнить две временные шкалы в субтитрах (например, 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'!

Я хочу перезаписать первую часть временных шкал на 2-й части их предыдущей строки. Будьте осторожны, чтобы все временные линии не мешали друг другу. некоторые из них являются правильными и короче их следующего графика времени! Вмешательство только для некоторых из них.

2
задан 24 March 2019 в 11:50

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

Вышеупомянутый код сравнивает B и 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 правильными кодами сценария!

2
ответ дан 24 March 2019 в 11:50

Другие вопросы по тегам:

Похожие вопросы: