Среди анимешников принято смотреть аниме с оригинальной озвучкой и субтитрами, потому что все альтернативные озвучки — в лучшем случае приемлемые, в среднем — отвратительные. Поэтому время от времени встаёт задача субтитры подгонять.
Субтитры — это текстовый файл, состоящий из фраз. Каждая фраза включает в себя, по минимуму, текст, время начала и время окончания. Примерно вот так:
Dialogue: Marked=0,0:00:13.00,0:00:15.00,*Default,,0000,0000,0000,,Lorem ipsum dolor sit amet.
Соответственно, плеер при наступлении начального времени (13 секунд от начала файла) показывает текст на экране, а при наступлении конечного (15 секунд) прячет его.
Это формат программы SubStation Alpha. В настоящее время — один из самых продвинутых форматов. В частности, в нём есть понятие стиля. Стили задают форматирование — цвет, шрифт, расположение субтитров, закрепляя за каждым вариантом оформления имя.
Это всё background. А теперь проблема.
Программы редактирования субтитров, в большинстве своём, представляют собой структурные редакторы. То есть, при загрузке файл разбирается в некий внутренний формат, и всё редактирование делается в виндовой формочке. Отдельно время начала, отдельно время конца, отдельно текст. И выпадающий список стилей. Понятно, если формат где-то нарушен, то загрузить файл не представляется возможным, а перемещение с одного места на другое сопряжено с длительным тасканием мыши.
Почему-то все виденные мной редакторы субтитров при нажатии на клавишу сдвига двигают только текущую фразу. Видимо, по принципу «двигать умеем, остальное не волнует». Я за собой замечал: когда мне надо править тайминг в готовых субтитрах, самые часто встречаемые проблемы — это (1) одна фраза в субтитрах длиннее/короче, чем в фильме, (2) одна пауза в субтитрах длиннее/короче, чем в фильме. Отсюда вывод: редактор должен иметь клавиши для операций «сдвинуть все фразы, начиная с текущей, на некоторый квант времени», и «сдвинуть конец текущей и целиком все последуюшие фразы».
Очень редко в редакторе есть встроенный плеер, чтобы можно было посмотреть, как оно вообще будет. Практически никогда этот плеер не поддерживает стили. То есть всё валится одним шрифтом вниз. А я хочу видеть, как оно будет. Вывод: для просмотра должен использоваться внешний плеер, поддерживающий SSA в полном объёме. И просмотр должен синхронизироваться с позицией курсора в редакторе.
Ну и, наконец, стили. Я обычно использую минимум три стиля — обычная фраза, overvoice (голос за кадром, обозначающий мысли персонажа) и caption (перевод надписи в кадре). Тут use case простой. На входе имеется полностью неформатированный текст после распознавания с DVD. Нужно во время просмотра определять подходящий стиль и применять его без остановки плеера. Соответственно, никаких выдёргиваемых мышью combo box’ов — стили должны быть назначены на клавиши.
Поразмыслив, посидел на выходных, поразбирался в том, как писать плагины к FAR’у, и как рулить программно Media Player Classic’ом (мой любимый плеер на данный момент, и поддержка SSA в нём на уровне).
В принципе ничего сложного. Замечаю за собой, что от C’шного API уже воротит, хочется всё обернуть в C++, классики, шаблончики, RAII.
В общем, получилась такая штука. При активизации находит первый попавшийся запущенный экземпляр Media Player Classic’а и цепляется к нему. При включенном Scroll Lock’е раз в 200 миллисекунд спрашивает у него, где мы сейчас играем, и позиционируется на соответствующую фразу в редактируемом файле. И наоборот — при гулянии по файлу перематывает видео в плеере. В левой руке стили (QWE/ASD/ZXC), в правой тайминг (стрелки/Home/End/Ins/Del), на пробеле — пауза/play, и вперёд. Ну и, если приспичило текст подредактировать, то по Esc останавливаем плеер и вываливаемся в чистый редактор.
Теперь всё это потестировать…