2012-01-09 28 views
2

ここでは、4つのwavファイルを連結してwavAppended.wavを生成するコードを示します。この連結ファイルは、Windows Media Playerでうまく再生されます。 しかし、PlaySoundクラスを通して、one.wavだけが聞こえます。 誰も助けることができますか?JavaでのWAVファイルの連結

class PlaySound extends Object implements LineListener 
{ 
    File soundFile; 
    JDialog playingDialog; 
    Clip clip; 

    public void PlaySnd(String s) throws Exception 
    { 
     JFileChooser chooser = new JFileChooser(); 
     soundFile = new File(s); 
     Line.Info linfo = new Line.Info(Clip.class); 
     Line line = AudioSystem.getLine(linfo); 
     clip = (Clip) line; 
     clip.addLineListener(this); 
     AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile); 
     clip.open(ais); 
     clip.start(); 
    } 

    public void update(LineEvent le) 
    { 
     LineEvent.Type type = le.getType(); 
     playingDialog.setVisible(false); 
     clip.stop(); 
     clip.close(); 
    } 
} 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     int i; 
     String wavFile[] = new String[4]; 
     wavFile[0] = "D://one.wav"; 
     wavFile[1] = "D://two.wav"; 
     wavFile[2] = "D://three.wav"; 
     wavFile[3] = "D://space.au"; 
     AudioInputStream appendedFiles; 

     try 
     { 
      AudioInputStream clip0=AudioSystem.getAudioInputStream(new File(wavFile[0])); 
      AudioInputStream clip1=AudioSystem.getAudioInputStream(new File(wavFile[1])); 
      AudioInputStream clip3; 

      for (i=0;i<4;i++) 
      { 
       appendedFiles = new AudioInputStream(
       new SequenceInputStream(clip0, clip1), 
       clip0.getFormat(), 
       clip0.getFrameLength() + clip1.getFrameLength()); 
       AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE, new File("D:\\wavAppended.wav")); 

       clip3 = AudioSystem.getAudioInputStream(new File("D:\\wavAppended.wav")); 
       clip0=clip3; 
       clip1 = AudioSystem.getAudioInputStream(new File(wavFile[i+2])); 

      } 

      PlaySound p = new PlaySound(); 
      p.PlaySnd("D://wavAppended.wav"); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

1

WAVファイルは、そのように動作しません - がありますようあなただけの、(あなたは、例えば、JPEG画像を連結することはできませんと同じ)を一緒に複数のファイルを投げることができませんヘッダーがあり、データが複数の異なるフォーマットになっています。ファイルがまったく読み込まれているのには驚いています。

+0

感謝。 –

1

は、あなたが私のsmall projectを見ているかもしれWAV処理を開始するには。タイムインデックスファイルに基づいてWAVファイルをコピー&ペーストすることができます。プロジェクトには、必要なすべてのJava WAV処理(javax.sound.sampledを使用)が含まれている必要があります。 Butcher implementationおよびComposerには実際の処理が含まれています。

アイデアは単純です:入力オーディオファイルを取り出し、これらのファイルに含まれている単語のインデックス を作成します。インデックスエントリは、単語、開始時刻、 終了時刻です。新しい文章が作成されると、添え字から1語を取り出して を一緒にステッチします。

たAudioInputStreamは、Javaサウンド APIと対話するためのメインクラスです。あなたはそれからオーディオデータを読みます。オーディオデータを作成する場合は、 を作成して、AudioSystemが読み取ることができるAudioInputStreamを作成します。 実際のエンコーディングは、出力オーディオフォーマット に応じて、AudioSystem実装によって行われます。

Butcherクラスは、オーディオファイルに関係するクラスです。これは を読み込み、オーディオファイルを書き込んで、入力バイト 配列からAudioInputStreamを作成することができます。他の興味深いのは、ButcherがAudioInputStreamからサンプル を切り取っていると考えます。 AudioInputStreamは、 がPCM信号のサンプルを表すフレームで構成されています。フレームの長さは の倍数です。 AudioInputStreamの フレームから有効な範囲のフレームをカットするには、フレームサイズを考慮する必要があります。 開始時刻と終了時刻をミリ秒で開始バイト と開始フレームと終了フレームの終了バイトに変換する必要があります。 データはタイムスタンプとして保存され、使用するファイルのエンコード に依存しません。

Composerは出力ファイルを作成します。与えられた文に対して、入力ファイルから各単語の音声データを とし、 の音声データを連結し、その結果をディスクに書き込む。

最後に、PCMとWAV形式を理解する必要があります。 JavaサウンドAPIはそれを抽象化しません。上記の例では

+0

氏トーマス、あなたの返事に感謝します。しかし、私はwavファイルを処理する予備段階に入っています。あなたはあなたの2つの授業の実施を通じて実証していただけますか? –

+0

プロジェクト自体は、JavaサウンドAPIで何ができるのかをデモするためのものでした。あなたの問題はずっと簡単です。あなたは、あなたのAudioInputStreamsからすべてのバイトを読み込み、それらを1つの統合されたAudioInputStreamsに書き込むだけです。 (Composerは基本的には同じですが、入力ストリームから部品をカットすることでやや不明瞭です。) –

+0

これは 'OutputStream'から' InputStream'に変換する必要がある場合によくある問題です。方法については、[こちら](http://ostermiller.org/convert_java_outputstream_inputstream.html)をご確認ください。 – RockyMM

1

あなたはそれが正常に動作しますたSequenceInputStreamを使用する必要があります。 2つのファイルを結合するための私のコードを見つけてください。お返事のための

import java.io.File; 
import java.io.IOException; 
import java.io.SequenceInputStream; 

import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 

public class JoinWav{ 

     public static void main(String... args) throws Exception{ 
       String wav_1 = "1497434542598100215.wav"; 
       String wav_2 = "104860397153760.wav"; 
       AudioInputStream stream_1 = AudioSystem.getAudioInputStream(new File(wav_1)); 
       AudioInputStream stream_2 = AudioSystem.getAudioInputStream(new File(wav_2)); 
       System.out.println("Info : Format ["+stream_1.getFormat()+"] Frame Length ["+stream_1.getFrameLength()+"]"); 
       AudioInputStream stream_join = new AudioInputStream(new SequenceInputStream(stream_1,stream_2),stream_1.getFormat(),stream_1.getFrameLength()+stream_2.getFrameLength()); 
       AudioSystem.write(stream_join,AudioFileFormat.Type.WAVE,new File("join.wav")); 
     } 

} 
関連する問題