使用AudioTrack生成声音时如何提高声音质量?

时间:2016-11-20 23:10:59

标签: java android audiotrack audio-processing

我希望提高由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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

移位运算符的优先级高于按位AND (reference),因此您可能意味着:

generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8)

更新

您的音轨应为MONO而非STEREO以匹配您的波发生器功能,否则频率将加倍。

尝试在audioTrack.stop()之后立即致电audioTrack.write()