2016-02-28 105 views
1

我试图通过使用此代码的Java soundApi记录错误

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

import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.TargetDataLine; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println("Say what you see.."); 

     try { 
      AudioFormat format = new AudioFormat(
        AudioFormat.Encoding.PCM_SIGNED, 16000, 8, 1, 4, 16000, 
        false); 

      DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
      if (!AudioSystem.isLineSupported(info)) 
       System.out.println("Line not Supported"); 
      final TargetDataLine targetLine = (TargetDataLine) AudioSystem 
        .getLine(info); 
      targetLine.open(); 

      System.out.println("Recording"); 
      targetLine.start(); 

      Thread thread = new Thread() { 

       @Override 
       public void run() { 
        AudioInputStream audioStream = new AudioInputStream(
          targetLine); 
        File audioFile = new File("record.wav"); 
        try { 
         AudioSystem.write(audioStream, 
           AudioFileFormat.Type.WAVE, audioFile); 
        } catch (IOException ioe) { 
         ioe.printStackTrace(); 
        } 
        System.out.println("stopped recording"); 
       } 

      }; 
      thread.start(); 
      Thread.sleep(5000); 
      targetLine.stop(); 
      targetLine.close(); 
      System.out.println("Done"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

当我运行它,我总是得到这个错误录制16kHz的单声道.wav文件:

Line not Supported 
java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 16000.0 Hz, 8 bit, mono, 4 bytes/frame, is supported.at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)at Main.main(Main.java:29) 

PS:我用AudioFormat的不同参数对它进行了多次测试它只在我尝试了这些参数是立体声和44.1khz时才起作用

AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100,16,2,4,44100,false); 

回答

2

您必须指定一个与TargetDataLine支持的格式匹配的AudioFormat

例如我的Mac上的麦克风支持:

Supported Audio Formats

“未知的采样率”是指采样率没有关系。

我在这里看到的主要区别是,你指定每帧4个字节,对于8位单声道,这应该是每帧1个字节。

+0

爱你的男人:D,工作就像一个魅力! – Beeee