2017-02-15 2 views
0

Я закодировал функцию для захвата аудио с циклом while в netbeans. но последняя фигурная скобка кода while показывает ошибку компиляции, и я не знаю, почему (строка упоминается в коде с комментариями). Так или иначе я запускаю проект, и он говорит «скомпилировать с ошибками» и побежал. После запуска приложения я нажимаю jToggleButton, чтобы запустить закодированную функцию (Audio Capturing), и она успешно работала. после того, как я снова нажму на jToggleButton, чтобы остановить функцию (захват аудио), она также остановится. но после этого второго щелчка выходной терминал netbeans также показывает некоторые ошибки. Итак, я попытался найти, в чем проблема, но все еще не мог определить, что происходит с кодом. Надеюсь, я могу получить помощь отсюда.while ошибка цикла с jToggleButton: JAVA

Журналы ошибок:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, big-endian not supported. 
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513) 
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121) 
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:153) 
at javaapplication1.NewJFrame1$2.run(NewJFrame1.java:83) 
at java.lang.Thread.run(Thread.java:745) 
BUILD SUCCESSFUL (total time: 10 seconds) 

Код:

package javaapplication1; 

import java.io.ByteArrayOutputStream; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.TargetDataLine; 


public class NewJFrame1 extends javax.swing.JFrame { 


public NewJFrame1() { 
    initComponents(); 
} 


@SuppressWarnings("unchecked") 

private void initComponents() { 

    jPanel1 = new javax.swing.JPanel(); 
    jToggleButton1 = new javax.swing.JToggleButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout()); 

    jToggleButton1.setText("jToggleButton1"); 
    jToggleButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jToggleButton1ActionPerformed(evt); 
     } 
    }); 

    jPanel1.add(jToggleButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 70, -1, -1)); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
    ); 

    pack(); 
}     

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {            

Thread t = new Thread(new Runnable() 
{          
    @Override       
    public void run()     
    {         

AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true); 
{TargetDataLine microphone; 
SourceDataLine speakers; 

try { 
    microphone = AudioSystem.getTargetDataLine(format); 

    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
    microphone = (TargetDataLine) AudioSystem.getLine(info); 
    microphone.open(format); 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    int numBytesRead; 
    int CHUNK_SIZE = 1024; 
    byte[] data = new byte[microphone.getBufferSize()/5]; 
    microphone.start(); 


    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format); 
    speakers = (SourceDataLine) AudioSystem.getLine(dataLineInfo); 
    speakers.open(format); 
    speakers.start(); 

    while(jToggleButton1.isSelected()){ 
     numBytesRead = microphone.read(data, 0, CHUNK_SIZE); 
     speakers.write(data, 0, numBytesRead); 

    } 
    speakers.drain(); 
    speakers.close(); 
    microphone.close(); 

    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
    } 

     } 
    } 

}   // This Carly Bracket shows red underline. but I don't know whyv?! 

t.start();  
    }   
}            


public static void main(String args[]) { 

    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 



    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new NewJFrame1().setVisible(true); 
     } 
    }); 
} 

// Variables declaration     
private javax.swing.JPanel jPanel1; 
private javax.swing.JToggleButton jToggleButton1; 

} 
+0

Там ошибка указывает, что звуковая библиотека не может обрабатывать формат звукового файла. –

+0

Необходимо добавить); за вашей подчеркнутой скобкой, чтобы закрыть новую тему. – KilledByCheese

+0

Спасибо @KilledByCheese. Я понял. и теперь эта ошибка исправлена. но на выходном терминале netbeans отображаются ошибки (упомянутые в вопросе). Можете ли вы мне помочь и в этом ...? Я попытался, но понятия не имею. – user7560586

ответ

1

// Этой Карли кронштейну показывает красное подчеркивание. но я не знаю почему?

Прочитайте ошибку компилятора, он говорит, чтобы закрыть это заявление с помощью );

Потому что вы не закрыли ниже заявление:

Thread t = new Thread (new Runnable() 
+0

Спасибо большое @Rohit Gulati, я понял это ясно. и теперь эта ошибка исправлена. но на выходном терминале netbeans отображаются ошибки (упомянутые в вопросе). Можете ли вы мне помочь и в этом ...? Я пробовал, но понятия не имею. – user7560586

+0

@ user7560586 не могли бы вы попробовать это [решение] (http://stackoverflow.com/a/12029800/5803493), так как проблема упоминается там точно такая же. –

+0

@ user7560586 Как указано в приведенной выше ссылке, вы открываете две строки в своем коде. Когда вы пытаетесь открыть второй, существование первого блокирует его. microphone.open (формат); и speakers.open (формат); –

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