基本知识:
1.unity只能播放44khz(16位)的音频吗?
答:不是,unity默认把所有的音频数据,重新采样到44khz的文件中,但这个取决于你的压缩格式,如果你的音频是48khz(24位)的音频,你希望不被重新采样,以原有的频率输出,则需要做的就是更改采样设置:
- Preserve Sample Rate - 默认情况下,此设置使采样率保持不变,保留原有的速率
- Optimize Sample Rate - 该设置根据分析的最高频率内容自动优化采样率。
- Override Sample Rate - 此设置允许手动重写采样率,并可用于丢弃频率内容。
注意:高频率的音频,文件大,但是质量好,适合短音频,低采样率的音频,文件小,质量稍差,适合长音频
2.常用的API
2.1 AudioSetting:
获得音频的播放模式(是单声道还是多声道还是环绕声)
获得mixer的当前输出速率
获得当前的音频配置AudioSettings.GetConfiguration
当前音频设置更改后触发的事件AudioSettings.OnAudioConfigurationChanged
当全局音频设置被更改时,通过audiosetings调用的委托。当操作系统控制面板改变采样率或默认输出设备的改变,例如当插入一个HDMI监视器或USB耳机。也会调用
通过AudioSettings.Reset设置音频配置,
比如:
AudioConfiguration _audioConfig = AudioSettings.GetConfiguration ();
_audioConfig.speakerMode = AudioSettings.driverCapabilities;
AudioSettings.Reset (_audioConfig);
2.2 AudioConfiguration 音频配置
public AudioSpeakerMode speakerMode; 设置音频的声道
public int dspBufferSize;dsp缓存大小
public int sampleRate;//设置采样率
public int numRealVoices;//设置游戏中同时可以播放的声音的数量
public int numVirtualVoices//游戏中管理声音的最大数量。超过这个限度,声音就会停止播放。
2.3 AudioSpeakerMode 枚举,单声道还是多声道
2.4Microphone
public static string[] devices;//返回设备上可用的麦克风设备,返回名字数组
public static void End(string deviceName);停止记录,如果传递为null或者空字符串,则为默认设备,下面的都一样
public static void GetDeviceCaps(string deviceName, out int minFreq, out int maxFreq);//获得设备的支持的采样频率,如果最 大和最小当中有0,说明该设备支持任意采样频率
public static int GetPosition(string deviceName);得到当前音频的位置,就是说当前音频采样的位置,返回值是以时间来返回的,可以用来延迟播放,如果不需要延迟,就和0比较,比如:while(!Microphone.GetPosition(null)>0){};audiosource.play();
不大于0表示还没有采样,如果延迟3ms就让Microphone.GetPosition(null)>3,再播放
public static bool IsRecording(string deviceName);//麦克风是否正在记录
public static AudioClip Start(string deviceName, bool loop, int lengthSec, int frequency);//麦克风开始记录,第一个为null或者空字符串,表示默认设备,第三个参数是录制多长时间,第二个参数表示到了指定时间,是否还继续录制,相当于录制了同时录制两种声音,第四个参数是录制的采样频率,比如44100,返回值是一个音频文件
注意:访问麦克风的时候会有相应的权限提示
3.如果在本游戏中关闭了声音,但是想要听到其它应用播放的声音,怎么做?
4.怎么把audioclip打包到assetbundle中?
创建一个空物体,添加audiosource组件,把要打包的audioclip添加上去,然后打包这个空物体
5.怎么让unity实时回放麦克风输入的话?
6.如果有很多音频,不想为每一个音频都新建一个空物体,怎么办?
可以在一个物体上挂载多个AudioSource组件,然后通过PlayOneShot播放
7.音频有延迟怎么办?
音频延迟25ms一下,就认为是正常的,在iOS上延迟大概20ms,但是在安卓上大概在200-300之间,解决的方法一个是在projectsetting->audio->DSP Buffer Size->Best Latency ,或者使用插件
8.怎么优化音频,使性能更好?
1.对于长音乐,一般是背景音
- 使用 Load Type “Streaming” 、 Compression Format “Vorbis”. 这种组合将使用最少的内存,但是需要一些CPU能力和磁盘I/O吞吐量
- 使用Load Type “Compressed In Memory” and Compression Format “Vorbis”. 和上面的方法唯一的区别是需要一些内存来存放音频文件.你可以调节Quality slider 来调节压缩的比率,通常 100%太高了. 推荐使用 70 %. 但是,如果你有两个以上的环境音,长音乐,这会消耗大量的CPU资源
2.对于短音乐
- 对于经常播放的段音乐, 使用Decompress On Load 和PCM 或者 ADPCM 的压缩格式. 选用 PCM压缩格式,在需要的时候不需要解压,所以加载的比较快. ADPCM需要解压,比 Vorbis要快一些
- 对于经常播放,大小中等的音频, 使用Compressed In Memory 和ADPCM 压缩格式. ADPCM比原生的 PCM耗时要少大概3.5倍,且它的解压缩算法要比 Vorbis.更少的消耗CPU资源
- 对于不经常播放,比较小的音频,使用 Compressed In Memory and ADPCM. 原因同上
- 对于不经常播放,中等大小的音频, 使用 Compressed In Memory and Vorbis Compression Format.