我希望提高由AudioTrack类产生的哔哔声质量。我尝试使用立体声格式,但它没有帮助。如何提高AudioTrack生成的声音质量?
下面你可以看到代码,它显示了我如何以高质量产生声音,但不幸的是,哔哔声的质量非常差。
class beeper {
private static byte generatedSnd[];
public static AudioTrack audioTrack;
public static void createAudioTrack() {
if (audioTrack == null) {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
48000,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
generatedSnd.length,
AudioTrack.MODE_STREAM);
if (Build.VERSION.SDK_INT < 21)
audioTrack.setStereoVolume(AudioTrack.getMaxVolume(),
AudioTrack.getMaxVolume());
else
audioTrack.setVolume(AudioTrack.getMaxVolume());
audioTrack.setPlaybackPositionUpdateListener(
new OnPlaybackPositionUpdateListener() {
@Override
public void onMarkerReached(AudioTrack track) {
}
@Override
public void onPeriodicNotification(AudioTrack track) {
}
});
}
}
static void sound(double frequency, double durationMs) {
generatedSnd = new byte[(int) (2 * 48000 * durationMs / 1000)];
double sample[] = new double[(int) (48000 * durationMs / 1000)];
for (int i = 0; i < sample.length; ++i) {
sample[i] = Math.sin(2 * Math.PI * i / (48000 / frequency));
}
int idx = 0;
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) (val & 0xff00 >>> 8);
}
createAudioTrack();
audioTrack.play();
audioTrack.write(generatedSnd, 0, generatedSnd.length);
}
public static void audioTrackdestroy() {
if (audioTrack != null) {
audioTrack.stop();
audioTrack.flush();
audioTrack.release();
audioTrack = null;
}
}
}
答案 0 :(得分:0)
移位运算符的优先级高于按位AND (reference),因此您可能意味着:
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8)
您的音轨应为MONO
而非STEREO
以匹配您的波发生器功能,否则频率将加倍。
尝试在audioTrack.stop()
之后立即致电audioTrack.write()
。