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 に入れて波を表示するとします。(200ms サウンド)...(200ms サウンドなし)...(200ms サウンド)...(200ms サウンドなし)

これは、.wav に書き込む前の pcm データにも当てはまります... (Yeahi syso すべてのもの)

したがって、ゼロフレームまたは sth が必要であると考える人もいるかもしれません。そこに...だから、値が0だけのすべてのフレームを切り落としました。これにより、wav ファイルのゼロ ブレークがわずかに短くなります。つまり、部分的なゼロ フレームが存在する必要があります。だから私はpcmデータからすべてのゼロ値を切り取りました...そして奇妙に思えますが、これはうまくいきました。ファイルは正常に聞こえます。

しかし、これは解決策にはなりません。これらの偽のゼロ値がある理由はまだわかりません。また、mp3 にも沈黙が必要です。

すべての説明のヒントをいただければ幸いです。ありがとう

4

2 に答える 2

4

このコードを使用して、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モノ 44、4モノ 22 です。他の組み合わせはまだ試していません。

于 2013-09-11T12:53:19.173 に答える
2

うーん...私の答えは少し遅くなります..申し訳ありません。

問題を完全に解決しました。

JLayer は奇妙なことをしました。入力 mp3 がステレオの場合、pcmbuffer の値は次のようにエンコードされます: leftchannel、rightchannel、leftchannel、... これが本来あるべき姿です。しかし、入力 mp3 が Mono の場合、同じ量のサンプルが pcmbuffer に取得されます。しかし、そうではありません: monochannel, 0, monochannel, 0 データ全体が pcmbuffer の前半にあり、後半はすべて 0 です。したがって、後半を切り取るだけです。

于 2013-03-15T19:40:09.863 に答える