为什么要使用媒体助手 Media Utils?
如果你遇到这些问题,那媒体助手可以帮到你:
- 【懒加载】作品中使用背景音乐,但加载太多背景音乐导致作品容量太大,加载缓慢,卡 99%
- 【懒加载】作品中大量 CV,希望根据玩家游戏进度加载音频内容
- 【视频播放】做 AVG 游戏, 背景希望是一个循环播放的视频,导入成帧动画后文件尺寸激增
- 【视频播放】游戏前 OP 想加视频
- 【视频播放】关卡完成后想播放效果炸裂的全屏特效
- 【音频特效】背景音乐循环播放,但当菜单出来的时候,希望音乐在不间断的情况下加特效
- 【音频特效】游戏中想让玩家在受伤后音效发生变化,有一种在浴室里听到隔壁邻居放歌的感觉
使用媒体助手的最佳实践案例
模块
Media Utils 主要分为 5 个模块:
模块 | 用途 |
资源相关 | 1. 所有从媒体库加载音频视频资源
2. 资源释放的管理
3. 资源被懒加载载入好了的事件 |
视频相关 | 1. 视频播放控制
2. 视频绘制控制
3. 视频播放过程中的事件监听
4. 视频的音量控制 |
音乐相关 | 1. 音频的播放控制
2. 音频的播放事件监听
3. 音频的音量控制 |
音效相关 | 1. 分别对 Scratch 中的音频、媒体库和主通道的音效控制
2. 低通滤波器控制
3. 混响控制
4. 延迟特效控制
5. 均衡控制 |
其他实验内容 | 1. 合成器播放声音(目前加了基本的 8 bit 音乐常用的 4 个合成器)
未来一些实验性的功能会在这里面先放出,测试稳定后再正式使用 |
资源相关
加载音频视频
载入媒体库中的资源到项目中,命名为 【key】。 其中【key】 是一个唯一的编号。 以下情况媒体库会这样处理:
情况 | 处理方式 |
一个视频资源和一个音频使用同样的 key | 允许,并且没有任何影响 |
两个不同的视频资源,使用同样的 key | 不允许,当视频不相同时,前一个 key 对应的视频会被替换 |
两个相同的视频资源,使用同样的 key | 允许,第二次执行时,不会重载资源。但会触发一次视频资源载入的事件 |
两个相同的视频资源,使用不同的 key | 允许,会被看成两个独立的资源,但不会有额外的网络加载 |
加载音视频事件
当资源被成功加载后,事件会被触发,其中参数 name 为在加载时对应的命名。
资源释放及状态查询
为了节约内存使用, 当资源不再使用时,请用上面的积木移出资源。
可以得到载入了的音频或视频。以 JSON Array 的形式返回,例如:
["bgm","video2","audio3"]
视频相关
判断是否载入的最好办法是使用事件驱动,也就是上面部分提到的事件。 如果特殊情况,不能使用事件驱动,可以下面语句判断资源是否载入:
当视频资源被载入后,就能用视频相关的代码来控制视频的渲染和播放了。
其中最核心的是视频播放相关的功能:
视频播放
在视频被载入后,播放前,需要告诉引擎如何绘制视频。 主要有三个部分的设置: 1. 绘制到哪个角色的上面还是下面; 2. 绘制到相对这个角色的 x, y 偏移量; 3. 绘制的视频大小。 注意以下情况的处理:
情况 | 处理方式 |
一个视频分别绘制到两个角色中 | 允许,会按设置分别绘制 |
绘制视频到一个角色,播放视频后调整角色坐标 | 视频的位置会跟着角色坐标做相对应的偏移。例如,原来的角色坐标为(0,50),移动到了(100,100); 视频绘制的xy偏移如果为(-50,-100),那么在角色移动前,视频的绘制坐标为(-50+0,-100+50), 移动后绘制的坐标为 (100-50,100-100) = (50,0) |
绘制视频到一个角色,调整这个角色的大小 | 视频按等比例缩放 |
宽和高为空,或者小于等于 0 时 | 按视频的原始分辨率渲染 |
宽设置一个大于 0 的数值,高不设置 | 保持设定的宽,高度按视频的长宽比动态计算 |
高设置一个大于 0 的数值,宽不设置 | 保持设定的高,宽度按视频的长宽比动态计算 |
设置好绘制位置后,就能播放视频了。 这句代码可以设置视频从什么时间点播放,以及播放完毕后做什么。 播放完毕后可以选择是【停止】 或者【循环】。
以及【暂停】【继续】播放视频,或者【移出】。 移出会销毁这个视频资源,不再占用内存。
在视频的全周期可以收到视频的各种事件,包括:【时长改变】、【载入进度】变化、播放时【当前时间改变】、【结束】播放、开始【播放】、【暂停】播放以及播放【错误】。
当然,当视频载入后,你也可以获得视频的各种信息,包括当前的【音量(dB)】、【当前进度时间】、视频的总【时长】、视频原始的【宽】和【高】
当然,你也可以随时设置视频的音量。
音乐相关
和视频一样,最佳实践是通过事件来判断某个音频是否已经载入成功。 当然,你也可以用下面的代码来做判断:
当音频载入后,就能对音频进入播放的操作了。 和视频不一样的是,音频不需要设置依附于哪个角色。
使用上面语句就能播放名为 loop 的音频,并且是从 0 秒开始播放。 播放完毕后可以选择是【循环】播放,还是【停止】播放。
当然,过程中,你也可以随时【暂停】播放、【继续】播放 或者【移出】资源(也就是销毁这个音频资源)
你可以像视频一样获得音频的【音量】、【当前时间】和【音频时长】
当然,你也可以改变音频的音量。
和一般的调整音量不一样的是,媒体助手为像 DJ 一样按你的指令在一定的时间内把音量做调整。
这个十分有用。 这会让你的游戏音量变化十分的自然,不会突然变大或变小。
当然,音乐播放中音量也是使用的 dB 为单位。 不知道为什么的话,请阅读
什么是 dB 单位,为什么音频里要用 dB最后,和视频一样,我们推荐的编程模式也是事件驱动式的。 也就是使用下面的事件来驱动程序的功能:
其中事件包括音频【播放】时、【播放完毕】时、【暂停】时和重新【继续播放】时。
音频特效相关
当已经能播放音频和视频后,接下来,在 Gandi 中,你是可以把音频视频的轨道加上各种音乐特效的。 所有的音乐特效可以加在:
- 【Scratch】 原生通道上,也就是所有在 Scratch 原生【声音】里播放的声音都会到这个通道上
- 【媒体库】通道上, 也就是用媒体助手加载的音频和视频会到这个通道
- 【主通道】上,也就是上面的 【Scratch】通道和【媒体库】通道加了特效后,都会接入【主通道】
目前开放的特效为:
特效 | 说明 | 常见设定 |
低通滤波器 | Low Pass Filter (LPF),指低于某个频率的波可以通过。 通常 LPF 的效果就像是隔着墙壁听到其他房间音乐的声音。因为高频的声音会被墙壁吸收,只有低频的声音可以听到。 这个常用于模拟疯狂的邻居在夜里放歌的感觉 | 在疯狂的邻居家: 44100
和音响有一些距离:10000
在疯狂的邻居家借用厕所: 1000
在疯狂邻居家的隔壁: 400
受够了疯狂的邻居,把头埋进枕头:100 |
混响 | Reverb ,相当于模拟回声。 例如在空旷的地方,是没有混响的,也就是没有回声的。相当于房间大小为 0。数值越高,混响越高,相当于回声越多越混浊。 | 卧室: 房间大小 1
澡堂:房间大小 10
教堂: 房间大小 40 |
延迟 | Delay,和混响类似,也是有回声的感觉。 但不一样的是每次回声的声音都会很清晰,而不是混浊的。 就像在一个墙壁很硬的房间一样。返回的回音也是清晰可辩识的。
其中【延迟】指的是多少毫秒后再听到一次声音,【反馈】指的是下一次的声音是原来的多少倍。 例如回声渐渐消失的感觉,如果 0.1 ms 反馈 0.4 指的是,在 音频播放 0.1 ms 后,会以 40% 的音量播放第二次,然后会在 0.1 + 0.1 ms 后,以 40% * 40% 的音量再播放第三次, 然后会在 0.1+ 0.1+0.1 ms 后,以 40% * 40% *40% 再播放第四次。 以此类推… | 正常房间:延迟 0.1, 反馈 0.4
山谷间:延迟 0.4, 反馈 0.1 |
均衡 | Pan,指的是左耳右耳的均衡。 -1 为全左耳, 1 为全右耳,0 为两边都有。 | 右边耳朵被耳屎堵住:-1
左边边耳朵被耳屎堵住:1
掏光了耳屎: 0 |
音量 | Volume,指的是,和字面一样,音量。 以 dB 为单位(对数坐标系) | 100% 音量: 0 dB
50% 音量: -3 dB
25% 音量: -6 dB
200% 音量: 3 dB |
以上所有特效对应的积木如下:
其中,【混响】和【延迟】有多出 “打开效果到【xx】”这个部分。 这个部分在音频里指的就是 干湿度(Dry/Wet),0 为干, 1 为湿。 也就是对应效率器的效果占比。 0 为占比 0%,1 为占比 100%
关于什么是 dB,为什么要使用 dB,请见文章
什么是 dB 单位,为什么音频里要用 dB其他实验功能
其他实验功能会在实验完成后成为正式的功能。
目前在实验的功能是合成器。 提供了 4 种 8 bit 音乐的常见合成器。【脉冲波】【方波】【三角波】和白【噪音】。 设置播放音符如果是单音用 [C/D/E/F/G/A/B][1/2/3/4/5/6/7/8] 进行组合。 例如 A 是la,4 是第四阶,中音, A4 在国际标准中频率 = 440 Hz。按照十二平均律,对应的 A5 为 880 Hz。 以此类推。如果要播放 440 Hz 的方波 1 秒,可以这样设置:
如果想播放 Amin 和弦,也就是 A C E 三个音,可以这样设置:
如果最后这部分看不懂,没关系,正常的。 学习了音乐和乐理知识后自然就懂了。
相关文章
暂无,后续社区中有好的音频相关的文章会在这里补充
历史更新 和 Roadmap
coming soon…