【发布时间】:2021-03-24 16:37:15
【问题描述】:
我想在 Android 上播放浮点数组。我想先走(我认为是)简单的方法,所以我想我会使用 AudioTrack。我选择使用静态模式是因为音频流不连续。在文档中它说:
在静态缓冲区模式下,将数据从偏移量 0 开始复制到缓冲区,写入模式被忽略。请注意,此数据的实际播放可能会在此函数返回后发生。
所以最初我的实现看起来像:
// constructor ..
audioTrack = new AudioTrack(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build(),
new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_FLOAT)
.setSampleRate(sample_rate)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO).build(),
sample_rate * 2 * 10, AudioTrack.MODE_STATIC, AudioManager.AUDIO_SESSION_ID_GENERATE);
[...]
public ... () { // function
audioTrack.write(sound, 0, sound.length, AudioTrack.WRITE_NON_BLOCKING);
audioTrack.play()
这导致了第一个问题,声音只能播放一次。我found 我需要在play() 之后调用stop() 和reloadStaticData()。但这会导致根本不播放第一个声音。并且任何以下声音都将播放错误(意味着声音错误)。
我尝试将stop() 和reloadStaticData() 放在write() 之后和play() 之前,然后播放第一个声音,但下一个声音错误(它们是第一个声音的截断版本而不是不同的声音)。
根据这些经验,在我看来 write() 实际上并没有写入缓冲区的开头。一般来说,我完全不清楚如何使用AudioTrack。 stop() 似乎停止播放。但是我必须在play()之后调用它来重置播放头位置。
【问题讨论】:
标签: android audiotrack