Unity + ADX2环境下录制游戏中的声音
Unity + ADX2环境下录制游戏中的声音
什么是游戏中的声音的录音
作为游戏的一个功能, 有可能需要可以在游戏内抓取游戏的实况然后投到网上, 或者制作某种声音app的时候需要输出wav. 即所谓的User Generated Contents功能.
ADX2虽然没有内置游戏内录音的功能, 但是有获取PCM数据的类, 可以利用这个才制作录音功能.
测试环境
Unity 2018.4.13f1 + ADX2 (CRIWARE SDK for Unity 3.00.04)
添加包
ADX2 for Unity Recorder
https://github.com/TakaakiIchijo/ADX2forUnityRecorder
ADX2声音输出的录音方法
ADX2有着对进行过各式各样的效果处理以及混音之后的最终输出的声音, 通过PCM的RAW数据(二进制数组)进行获取的功能.
CriAtomExOutputAnalyzer类的ExecutePcmCaptureCallback.
https://game.criware.jp/manual/unity_plugin/jpn/contents/classCriAtomExOutputAnalyzer.html
使用这个, 可以直接录音运行中的声音, 然后作为wav文件保存。
包里面有3个脚本文件,使用CriAtomExOutputAnalyzer抓取声音的CriAtomRecoder.cs,转换为wav格式并输出文件的WaveFileCreator.cs, 以及制作wav文件输出路径的RecordingADX2OnRuntime.cs。
转换获取的源数据为wave
虽然使用ExecutePcmCaptureCallback可以获取PCM数据的byte数组, 但是就这样直接输出为二进制文件也无法在PC等平台播放。
需要沿着wave格式进行数据制作, 严格按照格式进行保存。
设置方法
在以及导入了ADX2的工程里, 导入之前的包体。 在这之上, 将附加了CriAtomRecorder.cs的object放置到场景中。 然后在添加RecordingADX2OnRuntime.cs, 并在AtomRecorder的属性里添加这个脚本的参照。
(为了让CriAtomRecorder.cs可以在编辑器环境上运作, 类的构造可能和这份文章公开的时候不一样。 保存用文件路径的指定以及命名功能移动到了RecordingADX2OnRuntime.cs里面。)
让我们来看看录音功能的CriAtomRecorder.cs。
StartRecording方法被调用后, 首先创建一个WaveFileCreator的实例。 用来指定频道数,采样率, 以及文件保存路径。
然后开启Record的任务线程。
RecordCoroutine会在等在完ACB文件的读取之后, 生成一个CriAtomExOutputAnalyzer类的实例, 然后传送包含了各类设定的配置文件。
对于生成的类, 指定一个录音对象的DSP Bus。 如果需要录制所有的声音的话就指定为"MasterOut"。
然后, 回调方法里指定一个PcmCapture方法。
PcmCapture方法是用来对之前生成的waveFileCreator类将所抓取的PCM源数据传送给它的一个方法。
CriAtomExOutputAnalyzer需要每帧都调取ExecutePcmCaptureCallback, 所以录音开始后就在Update里调用。
最后准备了一个停止录音的方法。这时候, 之前开始的线程将会停止。然后为了能让这个object在废弃的时候能够正确的关闭wave文件、所以在CriAtomExOutputAnalyzer类里的OnDisable方法里写了下面的代码。
RecordingADX2OnRuntime.cs是CriAtomRecorder的使用方法的样本。提供了获取文件保存路径, 为文件名提供时间记录等功能。
OnRecordStart、OnRecordStop方法通过Button来调用、可以测试录音功能。
生成的WAVE文件的保存路径
RecordingADX2OnRuntime.cs的默认设置中, wav会保存至以下的文件夹里。
PC: C:\Users[UserName]\AppData\LocalLow[OrganizationName][AppName]\SavedGameData
iOS: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents\SavedGameData
Android: /data/[PackageName]/files\SavedGameData
可以把文件保存到内部存储器, 或者上传到外部的服务器, 也可以作为app内专用的内容保存。
wav文件的播放速度过快或者过慢的时候, 有可能是因为输出的采样率出了问题, 需要检查设置。
然后, iOS平台上默认会将数据同步到iCloud上。不想在iCloud备份的话, 可以更改设置SetNoBackupFlag。