我正在构建一个能够根据音频脉冲图标的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);
答案 0 :(得分:0)
问题在于,即使您指定了16位样本大小,也将字节视为样本。尝试这样的事情(注意绝对是不必要的,因为你无论如何都是平方的):
for (int i = 0; i < bytes.length/2; i+=2) {
int sample = bytes[i] << 8 || bytes[i+1];
sum += sample * sample;
}