2014-03-15 7 views
1

Код, который я написал, не прекращает запись, когда я нажимаю кнопку «console stop». Я не понимаю, что я сделал неправильно. Не могли бы вы посмотреть на код ниже и предложить, где моя ошибка?Остановить запись звука - Java

Здесь:

import java.io.File; 
import java.io.IOException; 
import java.util.Scanner; 

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.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 

public class Main { 

    final static int MONO = 1; 
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; 

    public static void main(String[] args) { 
     AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
       16000, 16, MONO, 2, 16000, true); 
     DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
     int numb = 1; 
     String files = "C:\\test\\music\\lala" + numb + "." + fileType; 
     File fileOut = new File(files); 

     if (!AudioSystem.isLineSupported(info)) { 
      System.out.println("Line nit supporot!"); 
     } 
     System.out.println("To stop recording a sound lead - stop"); 
     Scanner sc = new Scanner(System.in); 
     String scc; 
     TargetDataLine mike = null; 
     try { 
      mike = (TargetDataLine) AudioSystem.getLine(info); 
      mike.open(format); 
      AudioInputStream sound = new AudioInputStream(mike); 
      mike.start(); 
      AudioSystem.write(sound, fileType, fileOut); 

      scc = sc.nextLine(); 
      if (scc.equals("stop")) { 
       System.out.println("recording is stopped!"); 
       mike.stop(); 
       sound.close(); 
       System.exit(0); 
      } 
     } catch (LineUnavailableException e) { 
      System.out.println("line not avaible"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Это не работает:

import java.io.File; 
import java.io.IOException; 
import java.util.Scanner; 

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.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 

public class Main implements Runnable { 

    final static int MONO = 1; 
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; 
    private static TargetDataLine mike; 
    private static AudioInputStream sound; 

    public static void main(String[] args) { 
     AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
       16000, 16, MONO, 2, 16000, true); 
     DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
     int numb = 1; 
     String files = "C:\\test\\music\\lala" + numb + "." + fileType; 
     File fileOut = new File(files); 

     if (!AudioSystem.isLineSupported(info)) { 
      System.out.println("Line nit supporot!"); 
     } 
     System.out.println("Для остановки записи звука введите - g"); 
     try { 
      mike = (TargetDataLine) AudioSystem.getLine(info); 
      mike.open(format); 
      sound = new AudioInputStream(mike); 
      mike.start(); 
      AudioSystem.write(sound, fileType, fileOut); 

     } catch (LineUnavailableException e) { 
      System.out.println("line not avaible"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void run() { 
     Scanner sc = new Scanner(System.in); 
     String scc; 

     scc = sc.nextLine(); 
     if (scc.equals("g")) { 
      System.out.println("Запись звука остановлена"); 
      mike.stop(); 
      try { 
       sound.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      System.exit(0); 
     } 

    } 
} 
+0

Думаю, может быть, вам нужна тема здесь. –

+0

ErstwhileIII, спасибо) – user3384347

+0

parsa-porahmad, честно говоря, в потоках я не очень хорошо понимаю) – user3384347

ответ

0

Как далеко Ši может видеть, ваша реализация выше отсутствует главный раздел кода. Кажется, вы забираете строку (я не пробовал работать или отлаживал выше), но нет ничего, показывающего, где вы на самом деле читаете данные с этой строки!

Если вы обратитесь к примерам в учебниках по Java, раздел в разделе «Захват аудио» под названием Reading the Data from the TargetDataLine содержит код для этого процесса. Обратите внимание на использование логического «! Stop». Это логическое значение можно использовать для остановки цикла while для чтения из внешнего потока, например, при нажатии кнопки. Для достижения максимальной производительности логическое значение должно быть определено как volatile, а общедоступный метод, позволяющий установить его значение в значение «false».

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