2

我目前正在使用 javalayer 1.1 进行 mp3 解码。

所以我想从我的 44100 Hz、16 位、Mp3 接收原始 PCM 数据。它与立体声 mp3 完美配合,但我对单声道 mp3 有奇怪的问题。

这里有一些代码。

InputStream data = c.getResources().openRawResource(resId);
Bitstream bitstream = new Bitstream(data);
Decoder decoder = new Decoder();
while(thereIsData) {
  Head frameHeader = bitstream.readFrame();
  SampleBuffer buffer = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
  short[] pcmBuffer = buffer.getBuffer();

  // Do some stuff with pcm (For example creating a wav file )

  bitstream.closeFrame();
}

buffer.getChannelCount() == 1, buffer.getFrequency() == 41000

所以...问题是。如果我创建一个 44100 Hz、单声道、16 位 WaveFile 并将其放入 Audacity 以查看波形。声音周期性为 0,如:(200ms Sound)...(200ms NoSound)...(200ms Sound)...(200ms NoSound)

这也适用于写入 .wav 之前的 pcm 数据......(Yeahi syso 所有的东西)

所以有人可能会想,肯定有零帧之类的。在那里......所以我切断了所有只有0值的帧。这会导致 wav 文件中的零中断稍微短一些。对我来说意味着,必须有部分零帧。因此,我从 pcm 数据中删除了所有零值……尽管看起来很奇怪,但这确实有效。该文件听起来不错。

但这不能成为解决方案。我仍然不知道为什么会有这些错误的零值。我的mp3也需要静音。

我会很感激每一个解释提示。谢谢

4

2 回答 2

4

我让它工作,转换为字节 [],使用以下代码:

ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
int divider = 1;
if (SAMPLE_RATE < 44100) divider *= 2;
if (CHANNELS == 1) divider *= 2;

[...]

short[] pcmBuffer = buffer.getBuffer();    
for (int i=0; i<pcm.length/divider; i++) {
    outStream.write(pcm[i] & 0xff);
    outStream.write((pcm[i] >> 8 ) & 0xff);
}

关键是divider参数,即1立体声 44、2单声道 44 和4单声道 22。还没有尝试其他组合。

于 2013-09-11T12:53:19.173 回答
2

嗯……我的回答来晚了……抱歉。

我完全解决了这个问题。

JLayer 做了一些奇怪的事情。如果输入 mp3 是 Stereo,则 pcmbuffer 中的值编码如下:leftchannel,rightchannel,leftchannel,......这就是它应该的样子。但如果输入 mp3 是 Mono,我会在 pcmbuffer 中获得相同数量的样本。但它不像:monochannel, 0, monochannel, 0 整个数据在pcmbuffer的前半部分,后半部分都是0。所以你只需要剪掉后半部分。

于 2013-03-15T19:40:09.863 回答