blog-blog-blog

Перекодируем субтитры из SRT в ASS на Python.

Появилось желание смотреть видео с субтитрами на двух языках одновременно. Тема эта уже обсуждалась, были предложены скрипт для mplayer, а так же плееры с уже встроенной такой возможностью: kmplayer, powerdvd, bsplayer.
В VLC VideoLan уже 5 лет висит тикет 824, в котором запрашивали такую возможность.
Все эти варианты мне не подошли по разным причинам: проблемы с кодировкой, "корявое" воспроизведение, непривичный интерфейс. Я уже привык к Media Player Classic и хотел бы смотреть виде через него.
И мне пришла в голову идея быстрого слияния английского и русского STR субтитров в один ASS файл.
Ознакомившись со спецификацией ASS субтитров на сайте http://subs.com.ru/page.php?al=ssa_description, набросал стили для отображения русского и английского текста:
[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204

Стиль выбрал аналогичный шрифту по умолчанию для SRT субтитров в Media Player Classic, его можно изменить на свой вкус.

Для работы с SRT субтитрами существует библиотека PySrt http://pypi.python.org/pypi/pysrt/.
Сам скрип я только начал писать, еще не все реализовал, остается добавить обработку второго SRT файла, аргументы командной строки и, возможно, добавить графический интерфейс.
import os
import codecs

from pysrt import SubRipFile

INPUT_FILE = 'test.srt'
OUTPUT_FILE = 'out.ass'
FILE_ENCODE = 'cp1251'

head = '''[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text'''

OutSub = codecs.open(OUTPUT_FILE, encoding=FILE_ENCODE, mode='w+')
OutSub.write(head)
subs = SubRipFile.open(INPUT_FILE, encoding=FILE_ENCODE)
for sub in subs:
  start_time = sub.start.to_time().strftime('%H:%M:%S.%f')[1:-4]
  end_time = sub.end.to_time().strftime('%H:%M:%S.%f')[1:-4]
  string = sub.text.replace('\n', '\\N')[:-2]
  OutSub.write('Dialogue: 0,%s,%s,EngText,,0000,0000,0000,,%s\n' % (start_time, end_time, string))

Связываем Qt Creator и code.google.comСливаем два SRT в один ASS используя Python

Write a comment

New comments have been disabled for this post.