Видео

Ren'Py способен использовать FFmpeg (входит в комплект) для воспроизведения видео, используя видеокодеки:

  • AV1

  • VP9

  • VP8

  • Theora

  • MPEG-4 part 2 (включая Xvid и DivX)

  • MPEG-2

  • MPEG-1

и следующие аудиокодеки:

  • Opus

  • Vorbis

  • MP3

  • MP2

  • FLAC

  • PCM

в следующих форматах контейнеров:

  • WebM

  • Matroska

  • Ogg

  • AVI

  • Различные виды MPEG-потоков.

(Обратите внимание, что использование некоторых из этих форматов может потребовать патентных лицензий. В случае сомнений, и особенно для коммерческих игр, мы рекомендуем использовать AV1, VP9, VP8 или Theora; Opus или Vorbis; и WebM, Matroska или Ogg.)

Видео может отображаться в полноэкранном режиме или как отображаемый объект. Полноэкранные видео более эффективны. Видео в формате YUV444 не имеют аппаратного ускорения, вместо этого используйте YUV420 или YUV422.

Декодер видео в Ren'Py не поддерживает видео с альфа-каналами, но параметр side_mask отображаемого объекта Movie() может быть использован для этой цели. Вот пример использования ffmpeg для создания файла webm с маской side-by-side из файла mov с альфа-каналом.

ffmpeg -i original.mov -filter:v alphaextract mask.mov
ffmpeg -i original.mov -i mask.mov -filter_complex "hstack" -codec:v vp8 -crf 10 output.webm

Видео поддерживаются на веб-платформе, но список поддерживаемых кодеков отличается от браузера к браузеру. Для кросс-браузерной совместимости (особенно для поддержки Safari) самой эффективной комбинацией является H.264 с MP3 (или AAC) в файле MP4. Однако Ren'Py не поддерживает декодирование H.264 (или AAC), поэтому эта комбинация может работать только на веб-платформе.

Полноэкранные видео

Самый простой и эффективный способ отобразить видео в полноэкранном режиме — это использовать функцию renpy.movie_cutscene(). Эта функция отображает видео в полноэкранном режиме, пока оно не закончится или игрок не нажмёт, чтобы пропустить его.

$ renpy.movie_cutscene("On_Your_Mark.webm")

Отображаемые видео и видео-спрайты

Отображаемый объект Movie может быть использован для показа видео везде, где Ren'Py может показать отображаемый объект. Например, видео может быть показано в качестве фона экрана меню или как фон в игре.

Отображаемый объект Movie также может быть использован для определения видео-спрайта, который является спрайтом, основанным на двух видео. Основное видео предоставляет цвет спрайта. Второе видео, маска, предоставляет альфа- канал, где белый цвет — полная непрозрачность, а черный — полная прозрачность.

Видео, воспроизводимые с помощью отображаемого объекта Movie, автоматически зацикливаются.

Вот пример определения видео-спрайта:

image eileen movie = Movie(play="eileen_movie.webm", side_mask=True)

Видео-спрайт может быть показан с помощью инструкции show, которая автоматически начинает воспроизведение видео. Воспроизведение будет автоматически остановлено, когда отображаемый объект будет скрыт.

show eileen movie

e "I'm feeling quite animated today."

hide eileen

e "But there's no point on wasting energy when I'm not around."

Отображаемый объект Movie также может быть использован как часть экрана, при условии, что он создан на этапе init (например, как часть инструкции image).

image main_menu = Movie(play="main_menu.ogv")

screen main_menu:
    add "main_menu"
    textbutton "Start" action Start() xalign 0.5 yalign 0.5

На экране можно одновременно отображать несколько отображаемых видео или спрайтов, в зависимости от производительности системы, при условии, что все они имеют одинаковую частоту кадров. Поведение Ren'Py при отображении видео с разной частотой кадров не определено, но, скорее всего, будет включать значительное количество пропущенных кадров.

Функции Python

renpy.movie_cutscene(filename, delay=None, loops=0, stop_music=True)

Эта функция отображает видеовставку в течение указанного количества секунд. Пользователь может щёлкнуть мышью, чтобы прервать видеовставку. Overlays (наложения) и Underlays (подложки) отключаются на время показа видеовставки.

filename

Имя файла, содержащего любое видео, воспроизводимое Ren'Py.

delay

Количество секунд, которое нужно подождать перед завершением видеовставки. Обычно это длина видео в секундах. Если None, то задержка вычисляется из количества повторов (то есть loops + 1) * длина видео. Если -1, мы ждём, пока пользователь не щёлкнет мышью.

loops

Количество дополнительных циклов воспроизведения, -1 для бесконечного цикла.

Возвращает True, если видео было прервано пользователем, или False, если указанная задержка истекла без прерывания.

class Movie(*, size=None, channel='movie', play=None, side_mask=False, mask=None, mask_channel=None, start_image=None, image=None, play_callback=None, loop=True, group=None, **properties)

Это displayable, который показывает текущее видео.

size

Должен быть указан либо как кортеж, задающий ширину и высоту видео, либо None для автоматической подстройки под размер воспроизводимого видео. (Если None, displayable будет иметь размер (0, 0), когда видео не воспроизводится.)

channel

Аудиоканал, связанный с этим видео. Когда видеофайл воспроизводится на этом канале, он будет отображаться в этом Movie displayable. Если оставить значение по умолчанию "movie" и указать play, имя канала выбирается автоматически, используя config.single_movie_channel и config.auto_movie_channel.

play

Если задан, это должен быть путь к видеофайлу или список путей к видеофайлам. Эти видеофайлы будут автоматически воспроизводиться на channel, когда Movie отображается, и автоматически останавливаться, когда он скрывается.

side_mask

Если true, это указывает Ren'Py использовать режим маски side-by-side для Movie. В этом случае видео делится пополам. Левая половина используется для информации о цвете, а правая — для информации о прозрачности (альфа-канал). Ширина displayable равна половине ширины видеофайла.

По возможности, side_mask следует использовать вместо mask, так как он исключает возможность рассинхронизации кадров.

mask

Если задан, это должен быть путь к видеофайлу или список путей к видеофайлам, которые используются в качестве альфа-канала этого displayable. Видеофайл будет автоматически воспроизводиться на movie_channel, когда Movie отображается, и автоматически останавливаться, когда он скрывается.

mask_channel

Канал, на котором воспроизводится видео альфа-маски. Если не указан, по умолчанию используется channel_mask. (Например, если channel — "sprite", mask_channel по умолчанию будет "sprite_mask".)

start_image

Изображение, которое отображается, когда воспроизведение началось, но первый кадр ещё не был декодирован.

image

Изображение, которое отображается, когда задан play, но файл, на который он ссылается, не существует. (Например, это можно использовать для создания урезанной мобильной версии, которая не использует видеоспрайты.) Пользователи также могут выбрать это изображение в качестве запасного варианта в настройках, если видео слишком требовательно для их системы. Изображение также будет использоваться, если видео воспроизвелось и затем закончилось, если не задан group.

play_callback

Если не None, функция, которая используется для запуска воспроизведения видео. (Она может выполнять такие действия, как постановка в очередь перехода между спрайтами, если это необходимо.) Она вызывается со следующими аргументами:

old

Старый объект Movie, или None, если видео не воспроизводится.

new

Новый объект Movie.

Объект movie имеет параметр play, доступный как _play, в то время как поля channel, loop, mask и mask_channel соответствуют заданным параметрам.

Как правило, для этого потребуется использовать renpy.music.play() для запуска воспроизведения видео на указанном канале с synchro_start=True. Минимальная реализация выглядит так:

def play_callback(old, new):

    renpy.music.play(new._play, channel=new.channel, loop=new.loop, synchro_start=True)

    if new.mask:
        renpy.music.play(new.mask, channel=new.mask_channel, loop=new.loop, synchro_start=True)
loop

Если False, видео не будет зацикливаться. Если определён image, изображение будет показано по окончании видео. В противном случае displayable станет прозрачным.

group

Если не None, это должна быть строка. Если задано, и если видео еще не начало воспроизводиться, а другое видео в той же группе воспроизводилось в предыдущем кадре, последний кадр из того видео будет использован для этого. Это может предотвратить мигание прозрачности при переключении между двумя видео.

keep_last_frame

Если true и видео завершилось, будет отображаться последний кадр, а не скрываться displayable. Это работает только если loop равно false. (Такое поведение также произойдет, если установлен group.)

oversample

Если это значение больше 1, видео считается имеющим избыточную выборку (oversampled), с большим количеством пикселей, чем предполагает его логический размер. Например, если видеофайл имеет размер 1280x720 и oversample равен 2, то изображение будет рассматриваться как видео 640x360 для целей компоновки.

Если None, Ren'Py автоматически определит избыточную выборку. Если в имени файла найден символ @, за которым следует число, это число будет использоваться в качестве коэффициента избыточной выборки. В противном случае Ren'Py будет искать файлы и использовать их.

В частности, если используется launch.webm, Ren'Py будет искать launch@2.webm если видео масштабируется более чем в 1x, и launch@4.webm и launch@3.webm если видео масштабируется более чем в 2x.

Автоматическая избыточная выборка видео происходит только при начале воспроизведения.