1

我有一个 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);

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

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

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

mVisualizerView.updateVisualizer(fileContent);

这会产生一条曲线,但它看起来真的很疯狂,与我的预期无关(可能是因为我提供的是立体声而不是单声道?)。

我在创建 PCM 流的“波形”或“fft”数据方面也没有成功——我只是对我来说是新手。

有人有想法吗?

4

2 回答 2

0

尝试 AudioManager.setStreamMute(streamType, state)

于 2013-05-10T14:03:24.793 回答
0

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

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

Visualizer但正如您已经意识到的那样,您实际上并不需要API 来做您想做的事情。您可以创建画布或 OpenGL ES 纹理,每帧 (60 fps) 根据您的 PCM 数据绘制一些数据,并将其显示在您的应用程序的一个视图中。

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

如果您想绘制频谱图,事情会变得有点复杂,因为您首先必须将音频数据从时域转换到频域

于 2013-05-10T17:30:55.840 回答