Перейти к содержанию

Как создать свое видео USM

В движке можно использовать видеофайлы. Их можно вызывать из сцен, они используются при загрузке игры, при загрузке сохранения/локации в определенный сюжетный момент.

Как и многое в REDkit, работа с видео не самая очевидная. Движок использует формат USM (CRI Sofdec2) - это контейнер, содержащий видео и несколько аудиодорожек для разных языков.

Разработчики, как водится, не позаботились о нормальном инструменте для работы с этим форматом, поэтому будем использовать сторонний софт.

Учтите, что все видео жёстко привязаны к папке movies, так как пути к ним относительные. А например, загрузочные экраны вообще закреплены за папкой movies/cutscenes/storybook

Необходимые инструменты

Для распаковки USM

  • VGMToolBox - Распаковщик USM
  • vgmstream - Конвертер аудио
  • FFmpeg - Универсальный конвертер

Для упаковки USM

  • Scaleform VideoEncoder - Упаковщик USM
  • FFmpeg - Универсальный конвертер
  • Audacity (или любой другой аудиоредактор)

Распаковка USM

Если нужно отредактировать уже существующее видео, сначала его нужно распаковать.

  1. Извлечение видео и аудио
    1. Откройте VGMToolBox
    2. Перейдите в Misc. ToolsStream ToolsVideo Demultiplexer
    3. В списке Format выберите USM (CRI Movie 2)
    4. Поставьте галочку Extract Audio and Video
    5. Перетащите нужные файлы в пустую область

После этого в папке с оригинальными файлами появится:

  • Видео в формате .m2v
  • Несколько аудиофайлов .adx (по числу локализаций)

Конвертация аудио

Файлы .adx содержат звуковые дорожки. Названия у них невнятные, но по цифрам в имени можно определить, какому языку принадлежит конкретный файл.

ID Язык
40534641 Корневой 5.1 трек с музыкой и английской озвучкой
41534641 Польский
42534641 Немецкий
44534641 Французский
48534641 Русский
49534641 Китайский
4A534641 Японский
4B534641 Корейский
4C534641 Португальский
F534641 Альтернативный английский
50534641 Альтернативный польский
51534641 Альтернативный немецкий
53534641 Альтернативный французский
57534641 Альтернативный русский
58534641 Альтернативный китайский
59534641 Альтернативный японский

Чтобы сконвертировать .adx в .wav, используем vgmstream:

  1. Запустите консоль (WIN + R → CMD)
  2. Перейдите в папку с vgmstream командой: bash cd C:\\путь\к\vgmstream
  3. Введите команду:
    Bash
    vgmstream-cli.exe input_file.adx output_file.wav
    

Важно!

Полученный корневой 5.1-трек (40534641) после конвертации будет с неправильным порядком каналов.

Исправить можно перемапив в Audacity, либо через FFmpeg:

Bash
ffmpeg -i путь/к/аудио.wav -filter_complex "channelmap=0|1|4|5|2|3" output.wav

Упаковка USM

Тут все немного сложнее так как требует подготовки файлов.

Формат аудио

Самый важный аудиофайл - корневой. Он содержит 5.1 звук (шесть каналов).

Даже если у вас только стерео, всё равно нужно создать пустые каналы в любом аудиоредакторе и положить озвучку в правильный канал.

Распределение каналов (5.1):

Название Номер канала
Левый фронт (LF) 1
Правый фронт (RF) 2
Центральный (C) 3
Сабвуфер (LFE) 4
Левый окружающий (LS) 5
Правый окружающий (RS) 6

Что значит это на практике?

  • LF и RF - музыка
  • LS и LS - звуки окружения
  • С - только голос, он и меняется при смене языка
  • LFE - практически не используется и зачатую пустой

Пример правильного аудио: correct_audio.webp

Остальные аудиофайлы - это моно-дорожки, содержащие только голос.

Важно!

  • Все аудиофайлы должны быть в формате pcm_s16le или pcm_s32le
  • Длина всех файлов должна быть одинаковой с корневым 5.1-файлом

Подготовка файлов

Сначала конвертируем видео в AVI с максимальным качеством:

Bash
ffmpeg -i путь/к/видео.расширение -qscale:v 0 video.avi

Теперь подготавливаем аудиофайлы.

Конвертация корневого 5.1-аудио:

Bash
ffmpeg -i путь/к/аудио.wav -acodec pcm_s16le -y audio.wav

Конвертация остальных дорожек (моно)

Bash
ffmpeg -i путь/к/аудио.wav -acodec -ac 1 pcm_s16le -y audio.wav

Упаковка в USM

Используем Scaleform VideoEncoder.

  1. В поле Input Name укажите AVI-файл
  2. В Codec выберите Sofdec.Prime
  3. В разделе Other Audio добавьте все аудиофайлы

Размещаем треки согласно таблице:

Трек Язык
Track 0 Корневой 5.1 трек с музыкой и английской озвучкой
Track 1 Польский
Track 4 Французский
Track 8 Русский
Track 9 Китайский
Track 10 Японский
Track 11 Корейский
Track 12 Португальский
Track 15 Альтернативный английский
Track 16 Альтернативный польский
Track 17 Альтернативный немецкий
Track 19 Альтернативный французский
Track 23 Альтернативный русский
Track 24 Альтернативный китайский
Track 25 Альтернативный японский

Можете обратить внимание, что треки идут с пропусками. Скорее всего это резерв под не озвученные языки.

Если нужной локализации в списке нет, движок воспроизводит Track 0 с озвучкой по-умолчанию, там обычно английский, но в вашем моде это может быть другой язык если он не локализирован.

Альтернативные озвучки нужны для загрузочных экранов. Обычно в них другая версия файла частью истории. Можно выбирать в журнале, какую воспроизводить.

Готово

После того как вы все назначите просто нажмите кнопку Encode.

Субтитры

Движок поддерживает встроенные субтитры для USM-видео, и они хранятся в отдельных текстовых файлах с расширением .subs. Эти файлы находятся в папке subs, расположенной рядом с самим USM-видео. Субтитры для альтернативной озвучки расположены в папке altsubs.

Формат

Каждый файл субтитров должен называться так же, как видео, с добавлением кода языка в формате ISO. Например, если у вас есть ролик st_1.usm, то файлы субтитров будут выглядеть так:

Bash
subs/st_1_en.subs  (английские субтитры)
subs/st_1_ru.subs  (русские субтитры)
subs/st_1_de.subs  (немецкие субтитры)

Структура файла субтитров

Файлы .subs используют простой текстовый формат. Вот пример:

YAML
1
2
3
1000  
1000, 13100, В поисках Йеннифэр, своей давней любви, Геральт очутился в окрестностях деревни Белый Сад. Казалось, что чародейка опережает ведьмака лишь на шаг, и всё же она оставалась неуловимой.  
13200, 20400, В конце концов, благодаря коменданту нильфгаардского гарнизона, Геральт узнал, что Йеннифэр находится совсем рядом — в Вызиме.
  1. Первая строка - глобальная стартовая точка (в миллисекундах), с которой начинается отсчёт таймкодов.
  2. Каждая последующая строка содержит три параметра:
    • Время появления текста (относительно глобальной стартовой точки).
    • Время исчезновения текста.
    • Сам текст субтитров.

Время указывается в миллисекундах!


Автор: leviofanh

Документация поддерживается участниками сообщества REDkit RU