2015-09-02 2 views
1

я массив заполнен объектов javax.sound.sampled.Line.Info всех в настоящее время attatched микрофоныКак играть записывать звук на// с javax.sound.sampled.Line

Info[] sourceInfos = AudioSystem.getSourceLineInfo(Port.Info.MICROPHONE); 

Использование их я могу получить линии всех микрофонов

for (Info sourceInfo : sourceInfos) { 
    Line sourceLine = AudioSystem.getLine(sourceInfo); 
    // record sound from those lines 
} 

То же самое относится и к оратору

Info[] sourceInfos = AudioSystem.getSourceLineInfo(Port.Info.SPEAKER); 
for (Info sourceInfo : sourceInfos) { 
    Line sourceLine = AudioSystem.getLine(sourceInfo); 
    // play sound on those lines 
} 

Теперь я просто нужно е настроить, как воспроизводить звук на линии и как записывать звук из линии. Здесь я застрял и не смог найти решение.

Так просто, чтобы сказать, вопрос в том, как я могу читать/писать в строку?
Благодаря
Baschdi

ответ

1

Вы можете попробовать этот пример, чтобы захватывать и воспроизводить звук. Он основан на образцах, представленных в документах Java Sound API.

Вот ресурсы, которые могут относиться к:

  1. Accessing Audio System Resources
  2. Capturing audio.
  3. Playing audio.

    import java.io.ByteArrayOutputStream; 
    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.Mixer; 
    import javax.sound.sampled.SourceDataLine; 
    import javax.sound.sampled.TargetDataLine; 
    
    public class Audio { 
    
    boolean stopCapture = false; 
    ByteArrayOutputStream byteArrayOutputStream; 
    AudioFormat audioFormat; 
    TargetDataLine targetDataLine; 
    AudioInputStream audioInputStream; 
    SourceDataLine sourceDataLine; 
    byte tempBuffer[] = new byte[500]; 
    
    public static void main(String[] args) { 
        Audio audio = new Audio(); 
        audio.captureAudio(); 
    
    } 
    
    private AudioFormat getAudioFormat() { 
        float sampleRate = 8000.0F; 
        int sampleSizeInBits = 16; 
        int channels = 1; 
        boolean signed = true; 
        boolean bigEndian = true; 
        return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian); 
    } 
    
    private void captureAudio() { 
        try { 
    
         /* ~~~~~ UPDATE THIS PART OF CODE ~~~~~*/ 
    
         Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); //get available mixers 
         System.out.println("Available mixers:"); 
         for (int cnt = 0; cnt < mixerInfo.length; cnt++) { 
          System.out.println(mixerInfo[cnt].getName()); 
         } 
         audioFormat = getAudioFormat();  //get the audio format 
    
         DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat); 
    
         Mixer mixer = AudioSystem.getMixer(mixerInfo[3]); //getting the mixer for capture device 
    
         /* ~~~~~ UPDATE THIS PART OF CODE ~~~~~*/ 
    
         targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo); 
         targetDataLine.open(audioFormat); 
         targetDataLine.start(); 
    
         DataLine.Info dataLineInfo1 = new DataLine.Info(SourceDataLine.class, audioFormat); 
         sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo1); 
         sourceDataLine.open(audioFormat); 
         sourceDataLine.start(); 
    
         Thread captureAndPlayThread = new captureAndPlayThread(); //thread to capture and play audio 
         captureAndPlayThread.start(); 
    
        } catch (LineUnavailableException e) { 
         System.out.println(e); 
         System.exit(0); 
        } 
    } 
    
    class captureAndPlayThread extends Thread { 
    
        @Override 
        public void run() { 
         byteArrayOutputStream = new ByteArrayOutputStream(); 
         stopCapture = false; 
         try { 
          int readCount; 
          while (!stopCapture) { 
           readCount = targetDataLine.read(tempBuffer, 0, tempBuffer.length); //capture sound into tempBuffer 
           if (readCount > 0) { 
            byteArrayOutputStream.write(tempBuffer, 0, readCount); 
            sourceDataLine.write(tempBuffer, 0, 500); //playing audio available in tempBuffer 
           } 
          } 
          byteArrayOutputStream.close(); 
         } catch (IOException e) { 
          System.out.println(e); 
          System.exit(0); 
         } 
        } 
    } 
    
    } 
    

    `

Редактировать: Пожалуйста, обновите предыдущий код с помощью этого кода. Следующий фрагмент кода выбирает микшер, только если он поддерживает микрофон i.e, TargetDataLine. Точно так же вы можете использовать для динамиков, то есть SourceDataLine.

 Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); //get available mixers 
     System.out.println("Available mixers:"); 
     Mixer mixer = null; 
     for (int cnt = 0; cnt < mixerInfo.length; cnt++) { 
      System.out.println(cnt + " " + mixerInfo[cnt].getName()); 
      mixer = AudioSystem.getMixer(mixerInfo[cnt]); 

      Line.Info[] lineInfos = mixer.getTargetLineInfo(); 
      if (lineInfos.length >= 1 && lineInfos[0].getLineClass().equals(TargetDataLine.class)) { 
       System.out.println(cnt + " Mic is supported!"); 
       break; 
      } 
     } 

     audioFormat = getAudioFormat();  //get the audio format 
     DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat); 
+0

Как бы узнать, принадлежит ли микшер к микрофону или динамику? – Basti

+0

Я добавил код для выбора микшера, только если он поддерживает микрофон. В основном вам нужно перебирать смесители для этого. Теперь просто проверьте код. И еще одно замечание: код, который вы пытались реализовать с использованием интерфейса Line, должен использовать DataLine. Один из способов - использовать микшер, который я вам показал. Пожалуйста, прочитайте ссылку, чтобы лучше понять иерархию классов https://docs.oracle.com/javase/tutorial/sound/sampled-overview.html –

Смежные вопросы