2014-04-30 82 views
0

我正在使用Java将一些音频录制到ByteArrayOutputStream中,但是当我尝试播放该字节数组时,我得到一个LineUnavailableException。这是我的代码,播放音频:Java - 播放录制的音频 - LineUnavailableException

public void playTone(ByteArrayOutputStream 
    try { 
     AudioFormat format = new AudioFormat(44100, 8, 2, true, true); 
     DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
     byte audio[] = note.toByteArray(); 
     InputStream input = new ByteArrayInputStream(audio); 
     TargetDataLine line1 = (TargetDataLine) AudioSystem.getLine(info); 
     ... 
    } catch (LineUnavailableException e1) { 
     e1.printStackTrace(); 
    } 
} 

这是个例外,我得到:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 8 bit, stereo, 2 bytes/frame, not supported. 

现在我已经在this问题读到的AudioFormat的参数可能是错误的,但在那质疑用户使用24(比特)作为第二参数,其中仅支持8和16。

有谁知道我在做什么错?

编辑:

从下面我的回答改变后,因为我没有一个文件,而是一个ByteArrayOutputStream:

AudioFormat format = new AudioFormat(44100, 16, 2, true, true); 
byte audio[] = note.toByteArray(); 
InputStream input = new ByteArrayInputStream(audio); 
audioStream = new AudioInputStream(input, format, audio.length/format.getFrameSize()); 
// instead of 
// audioStream = AudioSystem.getAudioInputStream(soundFile); 

回答

0

你可以从这个清除您的概念。我认为这会帮助你。

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

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 

public class MakeSound { 

    private final int BUFFER_SIZE = 128000; 
    private File soundFile; 
    private AudioInputStream audioStream; 
    private AudioFormat audioFormat; 
    private SourceDataLine sourceLine; 

    /** 
    * @param filename the name of the file that is going to be played 
    */ 
    public void playSound(String filename){ 

     String strFilename = filename; 

     try { 
      soundFile = new File(strFilename); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 

     try { 
      audioStream = AudioSystem.getAudioInputStream(soundFile); 
     } catch (Exception e){ 
      e.printStackTrace(); 
      System.exit(1); 
     } 

     audioFormat = audioStream.getFormat(); 

     DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); 
     try { 
      sourceLine = (SourceDataLine) AudioSystem.getLine(info); 
      sourceLine.open(audioFormat); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 

     sourceLine.start(); 

     int nBytesRead = 0; 
     byte[] abData = new byte[BUFFER_SIZE]; 
     while (nBytesRead != -1) { 
      try { 
       nBytesRead = audioStream.read(abData, 0, abData.length); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      if (nBytesRead >= 0) { 
       @SuppressWarnings("unused") 
       int nBytesWritten = sourceLine.write(abData, 0, nBytesRead); 
      } 
     } 

     sourceLine.drain(); 
     sourceLine.close(); 
    } 
} 
+0

谢谢,我确实得改了一下,因为我没有一个文件,但我可以改变它的工作现在。我将编辑我的第一篇文章,其中包含我在代码中实际更改的内容,如果其他人也需要它。 – JeroenD