当.wav音量改变时,Android会显示一个图标

时间:2014-11-13 22:20:44

标签: android audio volume audiotrack

我正在构建一个能够根据音频脉冲图标的Android应用程序 - 简单的脉冲,最大音量的2倍音量和无音量的1倍音量。值得注意的是我的min api是15。

用户选择要播放的模式(文件),我使用AudioTrack在无限循环中播放它。每个wav样品的范围是<秒到2或3秒。 Audiotrack让我根据用户输入实时设置音量和音高(SoundPool没有正确改变Kitkat的音高)。 随着每个录音轨中音量的变化,我试图缩小和增长图标。到目前为止,我已经尝试使用可视化工具来获取轨道播放时的波形和fft数据,但我不确定这是否正确。

有没有办法从录像带获得(最近可能的)实时数据库更改?波形函数似乎总是在108到112之间,所以我不认为我正确使用它。最简单的pulse.wav示例是here

我的audiotrack init使用pcm数据中的byte []

AudioTrack mAudioTrack = new AudioTrack(AudioAudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, getMinBuffer(sound), AudioTrack.MODE_STATIC);
mAudioTrack.write(mSound, 0, mSound.length);
mAudioTrack.setLoopPoints(0, (int)(mSound.length / 4), -1);

我的展示台

Visualizer mVisualizer = new Visualizer(mAudioTrack.getAudioSessionId());
mVisualizer.setEnabled(false);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener {
    @Override
    public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
        double sum = 0;

        for (int i = 0; i < bytes.length; i++) {
            sum += Math.abs(bytes[i]) * Math.abs(bytes[i]);
        }

        double volume = (double) Math.sqrt(1.0d * sum / bytes.length);
        //THIS IS THE RESIZE FUNCTION//
        //resizeHeart((double) volume);
        System.out.println("Volume: " + volume); //always prints out between 108 and 112.
    }
    @Override
    public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
        //not sure what to do here.
    }
}, Visualizer.getMaxCaptureRate() / 2, true, true);
mVisualizer.setEnabled(true);

1 个答案:

答案 0 :(得分:0)

问题在于,即使您指定了16位样本大小,也将字节视为样本。尝试这样的事情(注意绝对是不必要的,因为你无论如何都是平方的):

    for (int i = 0; i < bytes.length/2; i+=2) {
        int sample = bytes[i] << 8 || bytes[i+1];
        sum += sample * sample;
    }