如何更快地在 android 上播放声音?
How to play sounds on android faster?
我正在努力向 Android 平台添加一项功能,以便以尽可能绝对最低的延迟从扬声器播放声音。我在 tinyalsa
外部项目中找到了 tinyplay.c
,我将其用作模型。我想打开 pcm 设备并播放声音并在可能的情况下在 10 毫秒内关闭它。
现在当我调用 pcm_params_get
或 pcm_open
时,有时只需要几毫秒,但有时最多需要 4 秒!我相信如果最近播放了 android 声音,则需要更长的时间。如果我提前打开好然后使用 pcm_write
音频播放速度非常快,只需几毫秒。我怎样才能保证更快的 pcm_open
时间,以便我可以更快地开始游戏?有什么方法可以强制它以某种方式更快地打开吗?我不介意我是否必须提前几百毫秒打开它,但是 4 秒太长了。
我意识到当我打开这个时我独占了音频驱动程序,这完全没问题。我只是不想永远垄断它。
更新
我已将 AudioFlinger 修改为不待机,这消除了 pcm_open
缓慢。现在我看到在调用 pcm_write
:
时扬声器发出声音之前有延迟
01-23 06:01:29.728: PCM write 16384
01-23 06:01:29.742: PCM write 16384
01-23 06:01:29.832: PCM write 16384
01-23 06:01:29.925: PCM write 16384
01-23 06:01:30.017: PCM write 6280
请注意,第一个 pcm_write
只需要 14 毫秒,但其他的需要 ~90 毫秒。从我的测量来看,第一个 pcm_write
似乎在没有扬声器实际发出我的声音的情况下返回。这是为什么?
解决方案有两个:
- 这需要平台级别的权限:将平台中的
kDefaultStandbyTimeInNsecs
修改为较低的值。平台来源还提到了 属性 ro.audio.flinger_standbytime_ms
.
- 使用与平台相同的采样率:48Khz
我正在努力向 Android 平台添加一项功能,以便以尽可能绝对最低的延迟从扬声器播放声音。我在 tinyalsa
外部项目中找到了 tinyplay.c
,我将其用作模型。我想打开 pcm 设备并播放声音并在可能的情况下在 10 毫秒内关闭它。
现在当我调用 pcm_params_get
或 pcm_open
时,有时只需要几毫秒,但有时最多需要 4 秒!我相信如果最近播放了 android 声音,则需要更长的时间。如果我提前打开好然后使用 pcm_write
音频播放速度非常快,只需几毫秒。我怎样才能保证更快的 pcm_open
时间,以便我可以更快地开始游戏?有什么方法可以强制它以某种方式更快地打开吗?我不介意我是否必须提前几百毫秒打开它,但是 4 秒太长了。
我意识到当我打开这个时我独占了音频驱动程序,这完全没问题。我只是不想永远垄断它。
更新
我已将 AudioFlinger 修改为不待机,这消除了 pcm_open
缓慢。现在我看到在调用 pcm_write
:
01-23 06:01:29.728: PCM write 16384
01-23 06:01:29.742: PCM write 16384
01-23 06:01:29.832: PCM write 16384
01-23 06:01:29.925: PCM write 16384
01-23 06:01:30.017: PCM write 6280
请注意,第一个 pcm_write
只需要 14 毫秒,但其他的需要 ~90 毫秒。从我的测量来看,第一个 pcm_write
似乎在没有扬声器实际发出我的声音的情况下返回。这是为什么?
解决方案有两个:
- 这需要平台级别的权限:将平台中的
kDefaultStandbyTimeInNsecs
修改为较低的值。平台来源还提到了 属性ro.audio.flinger_standbytime_ms
. - 使用与平台相同的采样率:48Khz