【发布时间】:2017-06-14 03:50:04
【问题描述】:
我想播放短于 1 秒的生成声音。但是,AudioTrack 的 minBufferSize 似乎总是 1 秒或更长。在某些设备上,我可以将 bufferSize 设置为小于使用 AudioTrack.getMinBufferSize 评估的值,但是这并非在所有设备上都可行。我想知道是否可以为 AudioTrack 生成更短的声音。我目前正在使用这段代码(它包含一些平滑,因为我不断得到新的频率):
int buffSize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffSize,
AudioTrack.MODE_STREAM);
short samples[] = new short[buffSize];
int amp = 10000;
double twopi = 8. * Math.atan(1.);
double phase = 0.0;
audioTrack.play();
double currentFrequency = getFrequency();
double smoothing = 300;
double deltaTime = buffSize / 500;
while (playing && PreferenceManager.getDefaultSharedPreferences(
MainActivity.this).getBoolean("effect_switch", true))
{
double newFrequency = getFrequency();
for (int i = 0; i < buffSize; i++)
{
currentFrequency += deltaTime * (newFrequency - currentFrequency) / smoothing;
samples[i] = (short) (amp * Math.sin(phase));
phase += twopi * currentFrequency / sampleRate;
}
audioTrack.write(samples, 0, buffSize);
}
audioTrack.stop();
audioTrack.release();
事实上,我希望更频繁地更新声音,这就是我需要更短样本的原因。
【问题讨论】:
-
与其专注于较短的声音片段,您就不能同时运行多个音轨吗?
-
我一直在玩这个,我得到了大约 80 毫秒的
minBufferSize(我相信)。 1280 字节用于 8kHz 采样(常见的电信音频采样率)和 7056 字节用于 44.1kHz 采样(最大值)。我只试过一种设备。您是否获得了多个设备的最大最小值?我使用相同的参数来获取minBufferSize、CHANNEL_OUT_MONO和ENCODING_PCM_16BIT。 -
@Gary99 我在两台设备上测试过
-
@RemyKabel 我觉得这听起来很糟糕,但我会试试看。
-
一个捷径可能是用零填充缓冲区中的剩余索引。