我目前正在使用 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
参数,即1
在立体声 44 中,2
在 mono-44 和4
在单声道 22 中。还没有尝试其他组合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)