ムービー link
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 の使用を勧めます )
ムービーは画面全体に、あるいは displayable 内に表示出来ます。フルスクリーンムービーはより効率的です。YUV444 ムービーはハードウェアアクセラレーションが働きませんので、代わりに YUV420 や YUV422 を使用してください。
Ren'Py の動画デコーダはアルファチャンネル付き動画をサポートしませんが、 Movie()
Displayable の side_mask パラメーターで代用できます。こちらは ffmpeg によってアルファチャンネルつきの mov ファイルから side-by-side マスクつきの webm ファイルを作成する方法の例です。
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
ムービーは webm プラットフォームでサポートされますが、サポートされるコーデックのリストはブラウザごとに異なります。ブラウザ間の互換性(特に Safari)に対して、もっとも有効な組み合わせはMP4ファイルのMP3 (またはAAC)と H.264 です。しかし Ren'Py は H.264 (またはAAC) デコードをサポートしないため、このためこの組み合わせは Web プラットフォームでのみ動作します。
フルスクリーンムービー link
フルスクリーンのムービーを表示する最も簡単で効率的な方法は renpypy.movie_cutscene()
関数の使用です。この関数はムービーが終わるかユーザーがクリックするまでムービーを表示します。
$ renpy.movie_cutscene("On_Your_Mark.webm")
Movie Displayables と Movie Sprites link
Movie displayable を使用して Ren'Py が displayable を表示可能な場所ならどこにでもムービーが表示出来ます。例えばメニューや背景としてムービーが表示出来ます。
Movie displayable を使用して 2 つのムービーからなる Movie sprite も定義出来ます。第一ムービーはスプライトの色を与えます。第二ムービーは白が完全に不透明で黒が完全に透明となるムービーをマスクするアルファチャンネルを与えます。
Movie displayable で再生されるムービーは自動的にループされます。
Movie sprite の定義例です。
image eileen movie = Movie(play="eileen_movie.webm", side_mask=True)
movie sprite は show statement で表示され、自動的に再生が開始します。また非表示になると自動的に停止します。
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 displayable もスクリーンの一部として使用可能です (例えば 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
複数の movie displayable や sprite がひとつのスクリーンに同時に表示可能ですが、システムのパフォーマンスに依存し、同じフレームレートを共有します。異なるフレームレートのムービーを表示したときの Ren'Py の振る舞いは未定義ですが、明らかなフレームレートの低下が予測されます。
Python Functions link
- renpy.movie_cutscene(filename, delay=None, loops=0, stop_music=True) link
これは動画のカットシーンを指定された秒数表示します。ユーザーはクリックでカットシーンを飛ばせます。オーバーレイ、アンダーレイはカットシーン中無効化されます。
- filename
Ren'Py で再生可能な動画のファイル名です。
- delay
カットシーンが終了するまでの秒数で、通常はムービーの長さです。 None なら時間は ( loops + 1) x ( ムービーの流さ ) で算出されます。 -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) link
これは現在の ムービーを表示する displayable です。
- size
これにはムービーの幅と高さのタプルか、自動的に再生するムービーのサイズに調整するなら None を指定します (None なら displayable はムービーが再生されていないとき (0, 0) になります )。
- channel
このムービーに関連づけられるオーディオチャンネルです。ムービーファイルがそのチャンネルで再生されると、この Movie displayable で表示されます。これが "movie" のままで play が渡されると
config.single_movie_channel
とconfig.auto_movie_channel
からチャンネル名が自動で選ばれます。- play
指定するならムービーファイルのパスまたはそのリストです。これらのムービーファイルはムービーが表示されると自動的に channel チャンネルで再生され、非表示にされると停止します。
- side_mask
True なら、Ren'Py が side-by-side マスクモードを Movie に使用するようにします。この場合、動画は半分に分けられます。左半分は色情報、右半分はアルファ情報です。 displayable の幅は動画ファイルの幅の半分となります。
フレームの同期がずれる可能性がないため、可能な場所では mask より side_mask を使用するべきです。
- mask
指定されるなら、この displayable のアルファチャンネルとして使用されるムービーファイルのパスまたはそのリストです。ムービーファイルはムービーが表示されると自動的に movie_channel チャンネルで再生され、非表示になると停止します。
- mask_channel
アルファマスクビデオが再生されるチャンネルです。指定されないと、 デフォルトで channel_mask が使用されます (例えば、channel が "sprite" なら、 mask_channel はデフォルトで "sprite_mask" になります)。
- start_image
再生が開始したが、最初のフレームがまだデコードされていないときに表示される画像です。
- image
play が指定されたが、参照するファイルがないとき表示する画像です (例えば、これを使用して movie sprites を使用しないモバイル用のバージョンを作成出来ます)。 ビデオがシステムに対して重すぎる場合、ユーザーが設定からこの画像を選択することも可能です。 group が指定されていなければ、画像はビデオを再生し終えた後にも使用されます。
- play_callback
None または、動画再生を開始するのに使用する関数です(スプライト間のトランジションをキューするようなときに使用します)。以下の引数で呼び出されます。
- old
古い Movie オブジェクトです。ムービーが再生されていないときは None になります。
- new
新しい Movie オブジェクトです。
movie オブジェクトの play パラメーターは
_play
として利用でき、channel
,loop
,mask
,mask_channel
フィールドは対応するパラメーターに対応します。一般的に、指定のチャンネルで synchro_start=True にして
renpy.music.play()
を使用して動画を再生するのが望ましいです。以下が最小の実装です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 が定義されると、ムービー停止時その画像が表示されます。そうでなければムービーは透明化します。
- group
None または文字列です。これが指定されていてムービーがまだ再生を開始しておらず、同じグループの他のムービーは以前のフレームで既に再生していれば、そのムービーの最後のフレームがこのムービーで使用されます。これにより2つのムービーの切り替え時の透明度のちらつきを防ぎます。
- keep_last_frame
True で movie が終了した場合、 movie は非表示にならず、最後のフレームが表示されます。これは loop が False の場合のみ動作します(この動作は group が設定されている場合にも発生します)。