mp3 - JLayer Mono Mp3 到 PCM 解码

标签 mp3 decode pcm

我目前正在使用 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 也需要静音。

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

最佳答案

我让它工作了,转换为 byte[],使用这段代码:

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 参数,在 stereo-44 中是 1,在 mono-44 中是 24 在 mono-22 中。还没有尝试其他组合。

关于mp3 - JLayer Mono Mp3 到 PCM 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13959599/

相关文章:

java - 如何使用Java通过Mac OS Terminal运行命令

php - 如何在 HTML、PHP 和 MySQL 中处理日语字符

c++ - ffmpeg 在多线程中解码 JPEG 2000

.net - 将 32 位波形转换为 16 位波形

audio - 将超声时间跟踪转换为.wav

python - codecs.ascii_decode(输入,self.errors)[0] UnicodeDecodeError : 'ascii' codec can't decode byte 0xc2 in position 318: ordinal not in range(128)

c# - 如何在pcm流(C#)中查找音频功率(db)

c# - 为内存中的流创建有效的 wav 文件头

android - 在 HTC One 上以 16khz 单声道 PCM (WAV) 录制时音频断断续续

IOS - 移动到单独的类(class)时播放 mp3 失败