Android:延迟 AudioTrack

标签 android audio audiotrack

我有一个 Android AudioTrack,例如:

private AudioTrack mAudioTrack;
int min = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, min, AudioTrack.MODE_STREAM);
mAudioTrack.play();

我填写:
mAudioTrack.write(buffer, 0, bufsize);

我想让这首轨道延迟 2 秒播放。知道我怎么能做到这一点吗?提前感谢您的任何好主意。

最佳答案

如果有人感兴趣,这是我自己的问题的答案。这个想法是创建一个临时缓冲区来创建和存储音频“延迟”。

一、初始化:

final int mSizeTable = 300;
private byte[][] mTableAudioBuffer = byte[mSizeTable][];
private int mCountAudioBuffer = 0;
...
mAudioTrack.play();

然后,我填写:
mTableAudioBuffer[mCountAudioBuffer] = buffer.clone();
int ret = 0;
if (mTableAudioBuffer[(mCountAudioBuffer + 1) % mSizeTable] != null)
    ret = mAudioTrack.write(mTableAudioBuffer[(mCountAudioBuffer + 1) % mSizeTable], 0, bufsize);
mCountAudioBuffer = (mCountAudioBuffer + 1) % mSizeTable;
return ret;

显然,就内存而言,它不是非常理想的,如果你想要一个很大的延迟,它可能会很贪婪。

关于Android:延迟 AudioTrack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13619375/

相关文章:

java - 尝试播放声音文件

java - 如何在 Java 中将 byte[] 转换为 float[] 并返回?

android - 客户端拒绝AUDIO_OUTPUT_FLAG_FAST

android - 为什么在 list 中使用 min-sdk 标签时位于 sdcard 上的 sqlite 数据库只读?

JAVA - 如何播放表示为 float[] 或 double[] 的音频声音

android - 如何从 contextMenu 访问 ListItem 位置

javascript - 在浏览器中启用/禁用同时音轨

java - 通过 Android 上的 TCP 套接字流式传输音频

java - 滑入(滑过) Activity

android - 如何使用蓝牙串口从Arduino接收数据到Android?