동영상
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의 동영상 디코더는 알파 채널이 있는 동영상을 지원하지 않지만 Movie() 디스플레이어블의 side_mask 매개변수로 같은 기능을 구현할 수 있습니다. 다음은 ffmpeg로 알파 채널이 있는 mov 파일에서 마스크를 옆에 나란히 배치한 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
웹 플랫폼에서도 동영상을 지원하지만 브라우저마다 지원 코덱 목록이 다릅니다. Safari를 포함한 여러 브라우저에서 호환되는 가장 효율적인 조합은 MP4 파일에 H.264와 MP3(또는 AAC)를 사용하는 것입니다. 다만 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 "오늘은 몸이 아주 활기차게 움직이네요."
hide eileen
e "하지만 제가 화면에 없을 때까지 힘을 낭비할 필요는 없겠죠."
Movie 디스플레이어블을 초기화 단계에 만들었다면 스크린의 일부로 사용할 수도 있습니다. 예를 들어 image 문에서 생성하면 됩니다.
image main_menu = Movie(play="main_menu.ogv")
screen main_menu:
add "main_menu"
textbutton "시작" action Start() xalign 0.5 yalign 0.5
시스템 성능이 허용하고 모두 프레임률이 같다면 여러 동영상 디스플레이어블이나 스프라이트를 동시에 표시할 수 있습니다. 프레임률이 다른 동영상을 함께 표시할 때 Ren'Py의 동작은 정의되어 있지 않으며, 많은 프레임이 생략될 가능성이 큽니다.
Python 함수
- renpy.movie_cutscene(filename, delay=None, loops=0, stop_music=True)
지정한 초 수만큼 동영상 컷신을 표시합니다. 사용자가 클릭하면 중단할 수 있습니다. 컷신 중에는 오버레이와 언더레이를 비활성화합니다.
- 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)
현재 동영상을 보여 주는 디스플레이어블입니다.
- size
동영상의 너비와 높이를 나타내는 튜플 또는 None입니다. None이면 재생 중인 동영상 크기에 자동으로 맞추며, 동영상이 재생 중이 아닐 때는 (0, 0)이 됩니다.
- channel
동영상에 연결할 오디오 채널입니다. 해당 채널에서 재생하는 동영상 파일을 이 Movie 디스플레이어블에 표시합니다. 기본값 "movie"를 유지하고 play를 지정하면
config.single_movie_channel과config.auto_movie_channel을 사용하여 채널 이름을 자동으로 선택합니다.- play
지정하면 동영상 파일의 경로나 경로 리스트여야 합니다. Movie를 표시할 때 channel에서 자동 재생하고 숨길 때 자동으로 중지합니다.
- side_mask
참이면 나란히 배치된 마스크 모드를 사용하도록 Ren'Py에 알립니다. 동영상을 반으로 나누어 왼쪽은 색상 정보, 오른쪽은 알파 정보로 사용합니다. 디스플레이어블의 너비는 동영상 파일 너비의 절반입니다.
프레임 동기화가 어긋날 가능성이 없으므로 가능하면 mask보다 side_mask를 사용해야 합니다.
- mask
지정하면 알파 채널로 사용할 동영상 파일의 경로나 경로 리스트여야 합니다. Movie를 표시할 때 movie_channel에서 자동 재생하고 숨길 때 자동으로 중지합니다.
- 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가 정의되어 있으면 동영상이 끝날 때 해당 이미지를 표시합니다. 그 밖의 경우 디스플레이어블은 투명해집니다.
- group
None이 아니면 문자열이어야 합니다. 지정했고 동영상이 아직 재생을 시작하지 않았으며 같은 그룹의 다른 동영상이 이전 프레임에 재생되었다면, 그 동영상의 마지막 프레임을 이 동영상에 사용합니다. 두 동영상을 바꿀 때 잠깐 투명해지는 현상을 막을 수 있습니다.
- keep_last_frame
참이면 동영상이 끝나도 숨기지 않고 마지막 프레임을 표시합니다. loop가 거짓일 때만 동작합니다. group을 설정한 경우에도 같은 동작을 합니다.
- oversample
1보다 크면 논리적 크기보다 많은 픽셀을 가진 오버샘플링 동영상으로 취급합니다. 예를 들어 파일이 1280x720이고 oversample이 2이면 배치 시 640x360 동영상으로 취급합니다.
None이면 Ren'Py가 오버샘플링을 자동으로 결정합니다. 파일명에 @ 뒤의 숫자가 있으면 배수로 사용합니다. 그렇지 않으면 대체 파일을 찾아 사용합니다.
구체적으로 :file`launch.webm`을 사용하고 동영상 배율이 1배를 넘으면
launch@2.webm를 찾습니다. 2배를 넘으면launch@4.webm와launch@3.webm를 찾습니다.동영상의 자동 오버샘플링은 재생이 시작될 때만 수행합니다.