我有一个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”数据 - 我只是对我不熟悉。
有人有想法吗?
答案 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。