从android中的mp3文件中获取pcm数据

时间:2012-02-06 21:26:44

标签: android android-mediaplayer

我的问题很简单。如何从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数据的常用方法吗?

1 个答案:

答案 0 :(得分:3)

我正在使用mpg123本机库来解码我的MP3。它以短路而非字节解码成PCM数据。我相信你可以进行转换。解码器非常快,因为它使用NDK。

http://www.badlogicgames.com/wordpress/?p=446

另外,

我不确定你的文件有多大,但我会将字节流式传输到AudioTrack,而不是把整首歌放在一个大的数组中。