我的问题很简单。如何从mp3文件中获取PCM数据?
现在我发现只有从歌曲中获取PCM字节的新方法,我加载并播放了MediaPlayer
的mp3并尝试通过Visualizer.OnDataCaptureListener
收听波形的变化。此接口的方法传递byte[] bytes
参数。我试图将所有这些字节保存到一个字节数组中,然后我将此数组传递给AudioTrack.write
方法并通过AudioTrack.play
方法播放它。像这样:
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
int samplingRate) {
// allBytes += bytes
}
public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
}
, Visualizer.getMaxCaptureRate() / 2, true, false);
}
然后
AudioTrack tr = new AudioTrack(AudioManager.STREAM_MUSIC, 22050,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
allBytes.length, AudioTrack.MODE_STREAM);
tr.play();
tr.write(barr, 0, allBytes.length);
但不幸的是我没有得到预期的结果。声音正在播放,但声音中有很多噪音,质量太差,你实际上无法识别那里的歌声。
但这是获取PCM数据的某种“黑客方法”。你能说一下从我的mp3中获取PCM数据的常用方法吗?
答案 0 :(得分:3)
我正在使用mpg123本机库来解码我的MP3。它以短路而非字节解码成PCM数据。我相信你可以进行转换。解码器非常快,因为它使用NDK。
http://www.badlogicgames.com/wordpress/?p=446
另外,
我不确定你的文件有多大,但我会将字节流式传输到AudioTrack,而不是把整首歌放在一个大的数组中。