2012-09-20 1 views
1

В качестве продолжения моего (еще нераскрытого) предыдущего вопроса, GUI event not triggering consistently, я обнаружил еще одну причуду. Приведенный ниже код создает и воспроизводит файл .wav:.wav файлы воспроизведения, но .aiff файлы не

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
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.Mixer; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.TargetDataLine; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 

public class audioTest extends JFrame { 

private static final long serialVersionUID = 1L; 
TargetDataLine targetDataLine; 
AudioCapture audCap = new AudioCapture(); 

public static void main(String[] args) { 
    new audioTest(); 
} 

public audioTest() { 

    layoutTransporButtons(); 
    getContentPane().setLayout(new FlowLayout()); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(350, 100); 
    setVisible(true); 
} 

public void layoutTransporButtons() { 

    final JPanel guiButtonPanel = new JPanel(); 
    final JButton captureBtn = new JButton("Record"); 
    final JButton stopBtn = new JButton("Stop"); 
    final JButton playBtn = new JButton("Playback"); 
    guiButtonPanel.setLayout(new GridLayout()); 
    this.add(guiButtonPanel); 
    captureBtn.setEnabled(true); 
    stopBtn.setEnabled(false); 
    playBtn.setEnabled(true); 

    JRadioButton[] radioBtnArray; 
    AudioFileFormat.Type[] fileTypes; 

    // Register anonymous listeners 
    captureBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      captureBtn.setEnabled(false); 
      stopBtn.setEnabled(true); 
      playBtn.setEnabled(false); 
      // Capture input data from the microphone 
      audCap.captureAudio(); 
     } 
    }); 
    guiButtonPanel.add(captureBtn); 

    stopBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      captureBtn.setEnabled(true); 
      stopBtn.setEnabled(false); 
      playBtn.setEnabled(true); 
      audCap.stopRecordAndPlayback = true; 
      audCap.stopRecording(); 
     } 
    }); 
    guiButtonPanel.add(stopBtn); 

    playBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      stopBtn.setEnabled(true); 
      audCap.playAudio(); 
     } 
    }); 
    guiButtonPanel.add(playBtn); 
} 

class AudioCapture { 

    volatile boolean stopRecordAndPlayback = false; 
    AudioFormat audioFormat; 
    AudioInputStream audioInputStream; 
    SourceDataLine sourceDataLine; 
    private String wavName; 
    private File audioFile; 

    /** 
    * capture audio input from microphone and save as .wav file 
    */ 
    public void captureAudio() { 

     wavName = JOptionPane.showInputDialog(null, 
       "enter name of file to be recorded:"); 
     try { 
      Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); 
      // Select an available mixer 
      Mixer mixer = AudioSystem.getMixer(mixerInfo[1]); 
      // Get everything set up for capture 
      audioFormat = getAudioFormat(); 
      DataLine.Info dataLineInfo = new DataLine.Info(
        TargetDataLine.class, audioFormat); 
      // Get a TargetDataLine on the selected mixer. 
      targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo); 
      // Prepare the line for use. 
      targetDataLine.open(audioFormat); 
      targetDataLine.start(); 
      // Create a thread to capture the microphone 
      Thread captureThread = new CaptureThread(); 
      captureThread.start(); 
     } catch (Exception e) { 
      System.out.println(e); 
      System.exit(0); 
     } 
    } 

    /** 
    * This method plays back the audio data that has 
    * been chosen by the user 
    */ 
    public void playAudio() { 
     // add file chooser 
     JFileChooser chooser = new JFileChooser(); 
     chooser.setCurrentDirectory(audioFile); 
     int returnVal = chooser.showOpenDialog(chooser); 
     // retrieve chosen file 
     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      // create the file 
      audioFile = chooser.getSelectedFile(); 
     } 
     // play chosen file 
     try { 
      audioInputStream = AudioSystem.getAudioInputStream(audioFile); 
      audioFormat = audioInputStream.getFormat(); 
      DataLine.Info dataLineInfo = new DataLine.Info(
        SourceDataLine.class, audioFormat); 
      sourceDataLine = (SourceDataLine) AudioSystem 
        .getLine(dataLineInfo); 
      // Create a thread to play back the data 
      new PlayThread().start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 
    } 

    /** 
    * This method creates and returns an AudioFormat object 
    */ 
    private AudioFormat getAudioFormat() { 
     float sampleRate = 44100.0F; 
     // 8000,11025,16000,22050,44100 
     int sampleSizeInBits = 16; 
     // 8,16 
     int channels = 1; 
     // 1,2 
     boolean signed = true; 
     // true,false 
     boolean bigEndian = false; 
     // true,false 
     return new AudioFormat(sampleRate, sampleSizeInBits, channels, 
       signed, bigEndian); 
    } 

    /** 
    * Inner class to capture data from microphone 
    */ 
    class CaptureThread extends Thread { 
     // An arbitrary-size temporary holding buffer 
     byte tempBuffer[] = new byte[10000]; 

     public void run() { 
      // reset stopCapture to false 
      stopRecordAndPlayback = false; 
      // record as wave 
      AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; 
      // take user input file name and append file type 
      audioFile = new File(wavName + ".wav"); 

      try { 
       targetDataLine.open(audioFormat); 
       targetDataLine.start(); 
       while (!stopRecordAndPlayback) { 
        AudioSystem.write(new AudioInputStream(targetDataLine), 
          fileType, audioFile); 
       } 
       targetDataLine.stop(); 
       targetDataLine.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    /** 
    * method to stop capture 
    */ 
    public void stopRecording() { 
     // targetDataLine.stop(); 
     // targetDataLine.close(); 
     // System.out.println("stopped"); 
    } 

    /** 
    * Inner class to play back the data 
    */ 
    class PlayThread extends Thread { 
     byte tempBuffer[] = new byte[10000]; 

     public void run() { 
      // reset stop button 
      stopRecordAndPlayback = false; 

      try { 
       sourceDataLine.open(audioFormat); 
       sourceDataLine.start(); 
       int cnt; 
       while ((cnt = audioInputStream.read(tempBuffer, 0, 
         tempBuffer.length)) != -1 
         && stopRecordAndPlayback == false) { 
        if (cnt > 0) { 
         sourceDataLine.write(tempBuffer, 0, cnt); 
        } 
       } 
       sourceDataLine.drain(); 
       sourceDataLine.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       System.exit(0); 
      } 
     } 
    } 
} 
} 

Я попытался изменить захват части для записи файла .aiff вместо этого, который работает, но воспроизведение теперь молчит. Я могу найти файл и играть с помощью других средств, и он отлично работает, но не в этой программе.

линии я изменил для записи .aiff являются:

// record as aiff 
AudioFileFormat.Type fileType = AudioFileFormat.Type.AIFF; 
// take user input file name and append file type 
audioFile = new File(wavName + ".AIFF"); 

Каждый знает, почему .wav файлы воспроизведения с помощью этого кода, но .aiff файлы не?

-EDIT- Я также пробовал использовать .aif в качестве суффикса, но это тоже не сработало. И мне пришло в голову, что это может иметь какое-то отношение к файлам, хранящимся как аудио AIFF-C, но я не мог найти в этом ничего более.

+1

Я не работал с аудио на Java, но мне кажется, что вы отправляете сжатые аудиоданные на аудиоустройство, и я думаю, что это не сработает. – yms

+0

Спасибо. Я не знал, как сохранить его, как .AIFF сжимает его. – Robert

ответ

1

AIFF-C is a compressed audio format, поэтому вы не должны отправлять его «как есть» на аудиоустройство. Сначала вам нужно сначала распаковать его на PCM.

+0

Спасибо. Любая идея, почему «AudioFileFormat.Type.AIFF» сохранит ее как AIFF-C, а не только AIFF? – Robert

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

  • Нет связанных вопросов^_^