Как я Dead Space Downfall на кадры нарезал
В связи с грядущим выходом ремэйка Dead Space и неявным продолжителем серии The Callisto Protocol я пересмотрел приквел к оригинальной игре и хочу поделиться некоторыми интересными моментами из этого анимационного хоррора.
В конце статьи я разовью мысль одной из недавних статей о том, как же правильно делать автоматически запускающиеся видео и как это сделать при помощи ffmpeg. Разберусь сам и покажу на примере.
Приятного просмотра!
Начало работы с ffmpeg
Немного вводных
Ранее я никогда не имел дело с видео контентом, но наткнувшись на одну из статей и комментарии к ней, мне стало любопытно попробовать способ нарезки через ffmpeg. Поскольку я сам работаю в IT, то порог вхождения меня не испугал. Да и в конце концов ffmpeg у меня уже давно лежит в беклоге программиста.
В качестве подопытного у меня оказался видео файл со следующими характеристиками:
Готовим рабочее место
В этом разделе я по шагам расскажу о том как я пришел от оригинального видео файла к одному из вырезанных кадров.
Первым делом надо посмотреть фильм, выделить интересные моменты и подготовить директорию к работе. У меня получился следующий сетап:
Теперь когда у нас все готово, можем начинать писать скрипт.
Собираем кадр
Для того чтобы загрузить и обработать видео файл через ffmpeg надо указать входной и выходной файлы. И тех и тех может быть несколько, но усложнять не будем:
Команда в таком виде нам не нужна, но от нее уже можно отталкиваться. Нам же нужно вырезать кадр. Для этого укажем тайминги аргументами -ss и -to:
Сразу добавим аргумент -y для автоматического пересохранения файла. Скрипт будет выполняться часто по мере написания, поэтому упрощаем себе жизнь где можем.
На выходе мы получил файл размером в 4мб. Неплохо! Уже укладываемся в заветные 5мб для авто воспроизведения, может нам тогда не продолжать? Как оказалось, нет. За авто воспроизведение отвечают не сколько размер файла, а его готовность к работе в браузере. Но об этом чуть-чуть попозже.
Вырезаем субтитры
В данном отрывке героиня в центре просто открывает рот, но хочется знать зачем. Давайте выведем субтитры для этого.
Как оказалось в ffmpeg удобнее всего работать последовательно по шагам и не пытаться сделать все сразу. Поэтому вырежем субтитры из видео файла и попробуем наложить их на результат.
Для того чтобы вырезать субтитры выполним команду:
Здесь нас интересует параметр -map 0:s:0. Как я понимаю, читается это так на человеческом: из первого входного файла (-i) берем первый поток субтитров (s:0). В первом потоке лежат субтитры "по-умолчанию". В данном случае русские, во втором (s:1) английские.
Также я указываю интервал для вырезки субтитров, поскольку я не хочу иметь субтитры для всего видео ряда и потом его синхронизировать с отрезком. Уже пробовал -- затея дурацкая. Интервал для субтитров чуть короче самого кадра -- это потому что я не хочу отображать вторую фразу.
Теперь мы готовы наложить получившиеся субтитры на отрезок:
Вы должны были заметить, что субтитры лежат почему-то в корне, а не в папке с остальными файлами кадра. Это потому что у меня так и не получилось указать нормальный путь до субтитров.
Готовим файл к работе в браузере
Получившийся видео файл мне нравится уже больше. Вырезан нужный отрезок и понятно о чем говорит персонаж. Что нам остается?
А теперь мы можем подготовить файл к исполнению в браузере. Для этого добавим специальный флаг, который перенесет некоторые метаданные о файле в самое начало бинарника. Таким образом, можно будет начать воспроизводить файл без полной его загрузки на устройство:
Теперь видео файл автоматически запускается, но все еще имеет один недостаток: это по прежнему видео файл с аудио дорожкой, который автоматически воспроизводится без звука и останавливается после его окончания. Наша же цель получить плавный автозапуск и зацикленность. Поэтому добавим также флаг -an:
Сжимаем файл
Теперь мы получили то что хотели! Осталось только поработать под размером файла.
Для этого добавим сжатие флагом -crf x, где x число от 0 до 51. Чем число больше, тем хуже качество и меньше размер результативного файла.
Также укажем новое разрешение флагом -s 640x480 и количество fps. Их я взял из метаданных видео файла и не изменял. Получается строка такого вида:
На выходе получаем файл размером 284 кб и совершенно не тот результат, который я хотел. Субтитры пропали. Почему?
Как оказалось, ffmpeg накладывает субтитры по его исходному размеру видео. Поэтому субтитры как бы присутствуют, но ты их не видишь. Они за экраном. Я пробовал масштабировать размер субтитров, но у меня это не удалось. Поэтому я сделал проще: взял для сжатия за основу видео файл предыдущего шага.
Итоговый скрипт
Поработав еще чуть-чуть над скриптом, добавив переменные и условия, у меня получился скрипт следующего содержания:
0.general.cmd
FirstEncounter.cmd
В результате выполнения получаем сжатый файл с автозапуском, зацикленностью, субтитрами и возможностью регулирования качества. В процессе написания скрипта были моменты, которые не получилось решить, но получилось обойти.
ffmpeg представляет большое количество функционала и возможностей, я ознакомился только с частью из них. В том числе у меня получилось наложить на кадр несколько файлов в посте с Банхаммером с их позиционированием.
Оригинальная статья