Уже было such a question, но похоже, что обходной путь, предложенный там, не работает вообще. Вывод Visualizer по-прежнему зависит от глобального тома и состоит из нулей, когда громкость полностью отключена, но MediaPlayer все еще воспроизводится.Выход визуализатора в Android зависит от объема устройства
Вот мой код, чтобы воспроизвести этот вопрос:
player=new MediaPlayer();
player.setAudioSessionId(SHARED_SESSION_ID);
try {
player.setDataSource("https://example.com/song.mp3");
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
player.prepareAsync();
}catch(Exception x){
Log.w(TAG, x);
}
equalizer=new Equalizer(0, SHARED_SESSION_ID);
equalizer.setEnabled(true);
visualizer=new Visualizer(SHARED_SESSION_ID);
int visualizerFftSize=Visualizer.getCaptureSizeRange()[1];
visualizer.setCaptureSize(visualizerFftSize);
visualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
int max=0, min=255;
for(int i=0;i<waveform.length;i++) {
int w=(int)waveform[i] & 0xFF;
max = Math.max(w, max);
min = Math.min(w, min);
}
Log.i(TAG, "wform "+max+"/"+min);
}
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
int max=0;
for(int i=0;i<fft.length;i++)
max=Math.max((int)fft[i] & 0xFF, max);
Log.i(TAG, "fft max "+max);
}
}, Visualizer.getMaxCaptureRate()/2, true, true);
visualizer.setEnabled(true);
Как ни странно, this example from ApiDemos прекрасно работает на одних и тех же устройств (Nexus 5, Nexus 4 и Nexus 6P). Я попытался скопировать его как можно ближе. Я также пытался инициализировать и/или включить эквалайзер до или после инициализации Visualizer, но это абсолютно ничего не изменило.
Я больше не работаю над этим проектом, но IIRC там была эта точная линия где-то по крайней мере в одном из видов деятельности. – Grishka