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

当.wav音量改变时,Android会显示一个图标,android,audio,volume,audiotrack,Android,Audio,Volume,Audiotrack,我正在构建一个android应用程序,它可以根据音频脉冲一个图标——简单脉冲,最大音量时2倍大小,无音量时1倍大小。值得注意的是,我的最小api是15 用户选择播放模式(文件),我使用AudioTrack在无限循环中播放。每个wav样本的范围从

我正在构建一个android应用程序,它可以根据音频脉冲一个图标——简单脉冲,最大音量时2倍大小,无音量时1倍大小。值得注意的是,我的最小api是15

用户选择播放模式(文件),我使用AudioTrack在无限循环中播放。每个wav样本的范围从<秒到2秒或3秒。Audiotrack允许我根据用户输入实时设置音量和音高(SoundPool在Kitkat中没有正确更改音高)。 随着每个音轨中音量的变化,我试图缩小和扩大图标。到目前为止,我已经尝试visualizer在播放曲目时获取波形和fft数据,但我不确定这是否正确

有没有办法从音轨中获取(尽可能接近的)实时db变化?波形函数似乎总是在108和112之间,所以我认为我没有正确使用它。最简单的pulse.wav示例是

我的audiotrack初始化使用pcm数据中的字节[]

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);
Visualizer mVisualizer=新的可视化工具(mAudioTrack.getAudioSessionId());
mVisualizer.setEnabled(false);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setDataCaptureListener(新的Visualizer.OnDataCaptureListener{
@凌驾
public void onWaveFormDataCapture(可视化工具可视化工具,字节[]字节,整数采样){
双和=0;
for(int i=0;i
问题在于,即使指定了16位样本大小,您仍将字节视为样本。尝试类似的方法(注意,腹肌是不必要的,因为你无论如何都在摆平):

for(int i=0;iint sample=bytes[i]这会导致运算符“| |”不能应用于“int”、“byte”的警告。有什么建议吗?
    for (int i = 0; i < bytes.length/2; i+=2) {
        int sample = bytes[i] << 8 || bytes[i+1];
        sum += sample * sample;
    }