RenPy优雅播放视频、限制用户skip
先说如何播放出一个视频出来,RenPy不支持MP4,还有H.264、H.265等常见视频编码
它支持的格式如下:
- AV1
- VP9
- VP8
- Theora
- MPEG-4 part 2 (包括Xvid和DivX)
- MPEG-2
- MPEG-1
我们要播放,首先就要把你导出的视频,给转化成上面的某个。 这里推荐VP9,转成webm格式。
如何转?答案是用ffmpeg,估计非开发人员也不会看我这篇博客,所以我就不扯怎么安装了
总之我们为了保证视屏质量、同时保证视频的大小,这里用两道编码来处理原视频
ffmpeg -i ed.mp4 -c:v libvpx-vp9 -b:v 3M -threads 8 -speed 4 -pass 1 -an -f null NUL; ffmpeg -i ed.mp4 -c:v libvpx-vp9 -b:v 3M -threads 8 -speed 1 -pass 2 -c:a libopus -b:a 160k ed.webm
上面的代码是将「ed.mp4」转换成「ed.webm」,码率选3m,整体效果不错,压缩率高,并且观看时不会觉得糊。
(注:原视频需要高码率,起码是一万以上)
然后就到了如何播放的问题,用原始命令播放自是可以
$ renpy.movie_cutscene(“On_Your_Mark.webm”)
但是在我看来还是不太能满足需求,尤其是当你遇到,需要去控制用户行为,不允许他跳过的时候。
比如说你播放一个特效、播放一个过场动画,这个时候是很容易被用户误触的。
根据我的实验、调试,我最终还是整理出来了一套生产可用的方法,那就是把他当成一个screen,强制渲染在最顶部,然后根据设置,锁住用户的所有UI、交互。
如下所示:
screen ed_player(vid_path):
add Movie(play=vid_path, channel="movie", size=(1920, 1080), keep_last_frame=True)
key "dismiss" action [] # 拦截左键点击/确认
key "K_SPACE" action [] # 拦截空格
key "skip" action [] # 拦截 Ctrl
key "stop_skipping" action []
key "toggle_skip" action [] # 拦截 Tab
key "hide_windows" action [] # 拦截 H 键和关联的隐藏 UI 动作
key "mousedown_3" action [] # 拦截鼠标右键按下
key "mouseup_3" action [] # 拦截鼠标右键弹起
key "game_menu" action [] # 拦截ESC和鼠标右键
使用:
# 禁用跳过功能
$ config.allow_skipping = False
show screen ed_player("movies/ed.webm")
$ renpy.pause(86.0)
hide screen ed_player
$ config.allow_skipping = True
这里有几个需要注意的点,首先就是 renpy.pause(86.0) 阻塞用户行为,这个阻塞的长度,是和你视频的长度一致的。视屏有多长,就阻塞用户多长时间。
然后,renpy的跳过,优先级非常的高,就算你锁住了所有的交互,用户一按skip键,他该跳还是会跳过。我用尽各种方法都没招。
所以我们只能在播放前,先手动把跳过功能给他从底层禁用了,然后在播放完毕后,解禁。
这样才能实现 不允许用户跳过 的功能。
环境:RenPy8.5
