2011-09-11 28 views
0

私は整数の2次元配列を持っています。最初のインデックスはチャネル数を示します。 2番目のサンプルはチャンネルのサンプル数を示します。この配列をオーディオファイルに保存するにはどうすればよいですか?バイト配列に変換する必要がありますが、どうすればいいのかわかりません。サンプルを含む配列をバイト配列に変換する

//編集

詳細情報私は既に波形を描くためのクラスを持っています。それはここにある:

http://javafaq.nu/java-example-code-716.html

は今、私はこの波の一部をカットして、新しいファイルに保存します。だから、私はint [] [] samplesContainerの一部を切り捨て、バイト配列に変換して(私にはわからない)、それをaudioInputStreamと同じフォーマットでファイルに保存する必要があります。

//編集

[OK]をクリックします。だから、最大の問題はこの1つに反転関数を記述することです:トンの第二のインクリメントが高い後、そこにある理由

protected int[][] getSampleArray(byte[] eightBitByteArray) { 
int[][] toReturn = new int[getNumberOfChannels()][eightBitByteArray.length/(2 * getNumberOfChannels())]; 
int index = 0; 
    //loop through the byte[] 
    for (int t = 0; t < eightBitByteArray.length;) { 
     //for each iteration, loop through the channels 
     for (int a = 0; a < getNumberOfChannels(); a++) { 
      //do the byte to sample conversion 
      //see AmplitudeEditor for more info 
      int low = (int) eightBitByteArray[t]; 
      t++; 
      int high = (int) eightBitByteArray[t]; 
      t++; 
      int sample = (high << 8) + (low & 0x00ff); 

      if (sample < sampleMin) { 
       sampleMin = sample; 
      } else if (sample > sampleMax) { 
       sampleMax = sample; 
      } 
      //set the value. 
     toReturn[a][index] = sample; 
     } 
     index++; 
     } 
    return toReturn; 
} 

私は理解していません。私はサンプルからどれくらい高く、低くすることもできないと考えていません。

+2

書き込みしようとしているオーディオファイルの種類について具体的にお聞かせください。バッチ整数をバイナリ・ファイルに書き込む方法を尋ねる場合は、['ByteBuffer'](http://download.oracle.com/javase/1,5.0/docs/api/java/)を調べるとよいでしょう。 nio/ByteBuffer.html)および['IntBuffer'](http://download.oracle.com/javase/1,5.0/docs/api/java/nio/IntBuffer.html)のクラス、より一般的には' 'java ' nio'](http://en.wikipedia.org/wiki/New_I/O) –

+0

不明な点があるかどうかわかりません。教えてください。 – ciembor

答えて

1

投稿したコードは、サンプルストリームに1バイトずつサンプルストリームを読み込みます。このコードでは、ストリーム内で2つの8ビットのバイトが16ビットのサンプルを形成し、各NumOfChannelsチャネルに対して1つのサンプルが存在すると想定しています。そのコードで返されるようなサンプルの配列を指定して、だから、

int[][] samples; 

とストリーミングのためのバイト配列、

byte[] stream; 

あなたはこのようバイトの逆の流れを構築するかもしれません

for (int i=0; i<NumOfSamples; i++) { 
    for (int j=0; j<NumOfChannels; j++) { 
     int sample=samples[i][j]; 
     byte low = (byte) (sample & 0xff) ; 
       byte high = (byte) ((sample & 0xff00) >> 8); 
       stream[((i*NumOfChannels)+j)*2] = low;  
       stream[(((i*NumOfChannels)+j)*2)+1] = high;   
    } 
    } 
関連する問題