静音AudioTrack / MediaPlayer上的Android Visualizer

时间:2013-04-17 15:10:44

标签: android pcm mute visualizer

我有一个PCM流,我想用Android的“Visualizer”进行可视化,但不会大声播放。

因此我实施了android-visualizer

如果我使用

,可视化就会成功
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
            AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
            fileContent.length, AudioTrack.MODE_STREAM);
audioTrack.play();
mVisualizerView.link(audioTrack);
..
audioTrack.write(fileContent, 0, bytes);

但现在我的问题是,我不想真正“玩”我的PCM,我只想想象它。我的用户可能会使用他们的媒体播放器听音乐,我不想打扰他们。

所以我想'好吧,我可以将我的AudioTrack静音':

audioTrack.setStereoVolume(0.0f, 0.0f);

但遗憾的是,也没有更多的可视化。 我认为Visializer应该忽略由SCALING_MODE_NORMALIZED

引起的AudioTrack的响度
  

定义一种捕获模式,根据该模式应用放大   捕获数据的内容。这是默认的Visualizer模式,和   适用于音乐可视化。

我尝试的下一步是没有将PCM写入音轨,而是将其直接提供给抽屉:

mVisualizerView.updateVisualizer(fileContent);

这创造了一条曲线,但它看起来真的很疯狂,与我的预期无关(也许是因为我提供立体声而不是单声道?)。

我也没有成功创建PCM-stream的“波形”或“fft”数据 - 我只是对我不熟悉。

有人有想法吗?

2 个答案:

答案 0 :(得分:0)

尝试AudioManager.setStreamMute(streamType,state)

答案 1 :(得分:0)

  

所以我想,好吧,我可以将我的AudioTrack'静音。但遗憾的是,也没有更多的可视化。

这就是它的工作方式。 AudioFlinger在应用效果之前执行混音(应用音量)(Visualizer是效果)。

但是,您并不真正需要Visualizer API来实现您想要做的事情,因为您已经意识到了这一点。您可以创建画布或OpenGL ES纹理,每帧(60 fps)根据PCM数据绘制一些数据,并在应用程序的某个视图中显示。

如果您只是想绘制波形,这将是微不足道的。我们假设您有一个100像素宽的位图要绘制到:在N帧,您需要从N *开始采集735(44100/60)个样本735并从中生成100个点(例如,通过对这些735个样本进行线性插值,并根据位图的垂直分辨率进行缩放)。如果您的PCM数据是立体声,您可以在插值点处取每对样本并对它们求平均值。

如果您想绘制spectrogram内容会变得更复杂,因为您首先必须将音频数据从时域转换为the frequency domain