【问题标题】:get pcm data from mp3 file in android从android中的mp3文件获取pcm数据
【发布时间】:2012-12-05 18:56:20
【问题描述】:

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

【问题讨论】:

  • 你能分享你为这个问题找到的解决方案吗?

标签: android android-mediaplayer


【解决方案1】:

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

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

还有,

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

【讨论】:

  • 是的,我会流式传输它,我使用字节变量只是为了测试。我已经找到了解决方案,我提出了我的答案。感谢重播!
  • @pleerock:您介意分享您的解决方案吗?几周以来,我一直在尝试从 Android 应用程序获取 PCM 流,但没有成功......
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多