2016-11-29 1 views
1

Java Sound APIを使用して2つのデータバッファを1つのオーディオファイルに別々のチャネルとして出力しようとしています。モノチャンネルオーディオを出力する方法を見つけましたが、それは私が探しているものではありません。私はどのオーディオフォーマット(WAV、MP3など)を使うべきかも知らない。私の2つのデータバッファは、-127から+127の範囲のバイト配列です。マルチチャネルオーディオファイルを保存

+0

明確にするために、Javaアプリケーション経由でサウンドを再生しているか、サウンドファイルを書き出し/書き出していますか?別々のチャンネルを言うときは、バッファー1のデータをステレオの左に、バッファー2をステレオの右に入れたいですか?それとも別の話をしているのですか? –

答えて

0

おそらく、投稿するコードがあります。

oracleのドキュメントを読んだか。または、thisのようなものを探しますか?

ファイル形式を使用する場合、私はMP3形式はWAVよりもはるかに少ないメモリを使用すると考えました。すべての形式はWAVに基づいていますが、ただ圧縮されているからです。

1

ここに、WAVファイルの作成方法を示すサンプルコードがあります。 MP3は、実際にはJavaでサポートされていませんが、ライブラリがあります。

import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.IOException; 

public class StereoOutput { 

    public static void main(final String[] args) throws IOException { 

     // left samples - typically more than 4!! 
     final byte[] left = new byte[] {1, 2, 3, 4}; 
     // right samples 
     final byte[] right = new byte[] {1, 2, 3, 4}; 

     final ByteArrayInputStream interleavedStream = createInterleavedStream(left, right); 

     // audio format of the stream we created 
     final AudioFormat audioFormat = new AudioFormat(
       AudioFormat.Encoding.PCM_SIGNED, 
       44100f, // sample rate - you didn't specify, 44.1k is typical 
       8,  // how many bits per sample, i.e. per value in your byte array 
       2,  // you want two channels (stereo) 
       2,  // number of bytes per frame (frame == a sample for each channel) 
       44100f, // frame rate 
       true); // byte order 
     final int numberOfFrames = left.length; // one frame contains both a left and a right sample 
     // wrap stream into AudioInputStream (data + format) 
     final AudioInputStream audioStream = new AudioInputStream(interleavedStream, audioFormat, numberOfFrames); 
     // write to WAV file 
     AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, new File("out.wave")); 
    } 

    /** 
    * Typically in PCM audio, left and right samples are interleaved. 
    * I.e.: LR LR LR LR. 
    * One LR is also called a "frame". 
    * 
    * @param left array with left samples 
    * @param right array with right samples 
    * @return stream that contains all samples in LR LR interleaved order 
    */ 
    private static ByteArrayInputStream createInterleavedStream(final byte[] left, final byte[] right) { 
     final byte[] interleaved = new byte[left.length + right.length]; 
     for (int i=0; i<left.length; i++) { 
      interleaved[2*i] = left[i]; 
      interleaved[2*i+1] = right[i]; 
     } 
     return new ByteArrayInputStream(interleaved); 
    } 
} 

私はJava Sound Trailを通してあなたの方法を作業をお勧めしますし、またAudioFormatのようなクラスのJava APIのドキュメントをチェックしてください。 PCMに精通していない場合は、それについても読んでください。デジタルサンプルオーディオを理解することは不可欠です。

関連する問題