unityiOS之视频处理

浅谈Unity中Android、iOS音频延迟

2019-02-25  本文已影响598人  nekocon

在Unity上面做音游,当在移动端实机运行起来,会发现,音频的发出会有一定的延迟,无论是长音效还是短音效,Unity内置的Audio内部使用的是FMOD,有以下手段改善

通过设置稍微改善其延迟的问题

代码来获取准确的音轨采样时间

AudioSource audioSource;
//100ms延迟
float GetTrackTime()
{
    return audioSource.time;
}
//20ms延迟
float GetTrackTime()
{
    return 1f * audioSource.timeSamples / audioSource.clip.frequency;
}
double trackStartTime;
void StartMusic()
{
    trackStartTime = AudioSettings.dspTime + 1;
    audioSource.PlayScheduled(trackStartTime);
}
double GetTrackTime()
{
    return AudioSettings.dspTime - trackStartTime;
}
Stopwatch stopwatch = new Stopwatch();
void StartMusic()
{
    audioSource.Play();
    stopwatch.Start();
}
double GetTrackTime()
{
    return stopwatch.ElapsedMilliseconds/1000f;
}
//timeSample的Get方法受限与音频异步的问题是有20ms的延迟的,但是Set方法几乎没有延迟
void SetTrackTime(float time)
{
    audioSource.timeSample = (int)(time *  audioSource.clip.frequency);
}

但是结果往往还是无法让人满意,经过测试,iOS大多数设备的延迟降到10ms以内,误差范围外,相当于没有了,但是安卓设备的延迟根据机型的不同有不同的延迟,大约在100ms~500ms

image.png

硬件和软件的原因造成了Android设备的延迟偏高以及不统一

音频播放的不同阶段

解决方案

在所有阶段中,除非重写安卓底层音频系统,否则我们开发者能够操作的部分只有音频的播放方式,目前安卓原生的播放方式有三种:

现有的解决方案推荐

关于长音频的延迟在各个机型上的不同而无法自动修正的解决方案

Unity2017默认音频、NativeAudio(OpenSL)、Criware(OpenSL)、Unity2019(OpenSL)默认音频延迟比较

根据以下视频的测试方式,通过音轨的采样图来
链接:https://pan.baidu.com/s/13sxkAWwFqh-9bxRow3DcWA
提取码:lrcl
最后测出如下延迟

短音效


单位是10ms
短音效延迟上NativeAudio和Criware是最低的,也是差不多的。

长音效


误差范围内的差距
效率待实验。

上一篇下一篇

猜你喜欢

热点阅读