⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiocapture.java

📁 Java 多媒体技术(附源码) Java 3D API JavaSound API 各种格式的多媒体数据文件 JBuilder开发环境
💻 JAVA
字号:
package AudioCaptureTransmit;import javax.media.*;import java.awt.*;import java.awt.event.*;import java.util.Vector;import java.io.IOException;import javax.media.protocol.FileTypeDescriptor;import javax.media.protocol.DataSource;import javax.media.control.StreamWriterControl;import javax.media.format.AudioFormat;import javax.swing.*;// 主界面类public class AudioCapture extends Frame{  RTPTransmit rtpTransmit = null;                              // RTP传输类对象  Label labelEncoding = new Label();  Choice choiceEncoding = new Choice();                        // 编码方法下拉列表框  Label labelSampleRate = new Label();  Choice choiceSampleRate = new Choice();                      // 采样率下拉列表框  Label labelBits = new Label();  CheckboxGroup checkboxGroupBits = new CheckboxGroup();  Checkbox checkbox8Bit = new Checkbox();                      // 每个样本的编码位数单选按钮  Checkbox checkbox16Bit = new Checkbox();  Label labelChannels = new Label();  CheckboxGroup checkboxGroupChannels = new CheckboxGroup();  Checkbox checkboxMono = new Checkbox();                      // 通道数单选按钮  Checkbox checkboxStereo = new Checkbox();  JLabel jLabel1 = new JLabel();  Label labelIP = new Label();  TextField textIPAdd1 = new TextField();                     // IP地址编辑框  TextField textIPAdd4 = new TextField();  TextField textIPAdd3 = new TextField();  TextField textIPAdd2 = new TextField();  Label labelPort = new Label();  TextField textPort = new TextField();                       // 端口号编辑框  JLabel jLabel2 = new JLabel();  Button buttonCaptureTransmit = new Button();  Button buttonStop = new Button();  // 设置界面和添加事件的监听  private void jbInit() throws Exception {    this.setLayout(null);    this.setBackground(Color.lightGray);    labelEncoding.setText("Encoding:");    labelEncoding.setBounds(new Rectangle(46, 50, 80, 20));    choiceEncoding.setBounds(new Rectangle(152, 50, 180, 20));    choiceEncoding.add("DVI/RTP");    choiceEncoding.add("G723/RTP");    choiceEncoding.add("GSM/RTP");    choiceEncoding.add("ULAW/RTP");    choiceEncoding.add("MPEGAUDIO/RTP");    choiceEncoding.select(0);    choiceEncoding.addItemListener(new java.awt.event.ItemListener() {      public void itemStateChanged(ItemEvent e) {        choiceEncoding_itemStateChanged(e);      }    });    labelSampleRate.setText("Sample Rate:");    labelSampleRate.setBounds(new Rectangle(46, 80, 80, 20));    choiceSampleRate.setBounds(new Rectangle(152, 80, 180, 20));    choiceSampleRate.add("22050.0");    choiceSampleRate.add("11025.0");    choiceSampleRate.add("8000.0");    choiceSampleRate.select(0);    labelBits.setText("Bits per Sample:");    labelBits.setBounds(new Rectangle(46, 110, 100, 20));    checkbox8Bit.setLabel("8 bit");    checkbox8Bit.setBounds(new Rectangle(152, 110, 60, 20));    checkbox8Bit.setCheckboxGroup(checkboxGroupBits);    checkbox16Bit.setLabel("4 bit");    checkbox16Bit.setBounds(new Rectangle(250, 110, 60, 20));    checkbox16Bit.setCheckboxGroup(checkboxGroupBits);    checkboxGroupBits.setSelectedCheckbox(checkbox16Bit);    checkbox8Bit.setEnabled(false);    labelChannels.setText("Channels:");    labelChannels.setBounds(new Rectangle(46, 140, 80, 20));    checkboxMono.setLabel("mono");    checkboxMono.setBounds(new Rectangle(152, 140, 60, 20));    checkboxMono.setCheckboxGroup(checkboxGroupChannels);    checkboxStereo.setLabel("stereo");    checkboxStereo.setBounds(new Rectangle(250, 140, 60, 20));    checkboxStereo.setCheckboxGroup(checkboxGroupChannels);    checkboxGroupChannels.setSelectedCheckbox(checkboxMono);    checkboxStereo.setEnabled(false);    jLabel1.setBorder(BorderFactory.createEtchedBorder());    jLabel1.setBounds(new Rectangle(20, 35, 336, 136));    labelIP.setText("IP Address:");    labelIP.setBounds(new Rectangle(46, 190, 85, 20));    textIPAdd1.setBounds(new Rectangle(152, 190, 42, 20));    textIPAdd2.setBounds(new Rectangle(198, 190, 42, 20));    textIPAdd3.setBounds(new Rectangle(244, 190, 42, 20));    textIPAdd4.setBounds(new Rectangle(290, 190, 42, 20));    labelPort.setText("Port:");    labelPort.setBounds(new Rectangle(46, 220, 70, 20));    textPort.setBounds(new Rectangle(152, 220, 42, 20));    jLabel2.setBorder(BorderFactory.createEtchedBorder());    jLabel2.setBounds(new Rectangle(20, 178, 336, 78));    buttonCaptureTransmit.setLabel("Capture&Transmit");    buttonCaptureTransmit.setBounds(new Rectangle(40, 272, 135, 22));    buttonCaptureTransmit.addActionListener(new java.awt.event.ActionListener() {      public void actionPerformed(ActionEvent e) {        buttonCaptureTransmit_actionPerformed(e);      }    });    buttonStop.setLabel("Stop");    buttonStop.setBounds(new Rectangle(204, 272, 135, 22));    buttonStop.addActionListener(new java.awt.event.ActionListener() {      public void actionPerformed(ActionEvent e) {        buttonStop_actionPerformed(e);      }    });    this.add(labelEncoding, null);    this.add(choiceEncoding, null);    this.add(labelSampleRate, null);    this.add(choiceSampleRate, null);    this.add(labelBits, null);    this.add(checkbox8Bit, null);    this.add(checkbox16Bit, null);    this.add(labelChannels, null);    this.add(checkboxMono, null);    this.add(checkboxStereo, null);    this.add(jLabel1, null);    this.add(labelIP, null);    this.add(textIPAdd1, null);    this.add(textIPAdd2, null);    this.add(textIPAdd3, null);    this.add(textIPAdd4, null);    this.add(labelPort, null);    this.add(textPort, null);    this.add(jLabel2, null);    this.add(buttonCaptureTransmit, null);    this.add(buttonStop, null);    this.addWindowListener(new java.awt.event.WindowAdapter() {      public void windowClosing(WindowEvent e) {        this_windowClosing(e);      }    });    this.setSize(new Dimension(378, 308));    this.setTitle("Audio Capture and Transmit");    this.setVisible(true);  }  // 构造函数  public AudioCapture() {    try {      jbInit();              // 显示出界面    }    catch(Exception e) {      e.printStackTrace();    }  }  // 响应用户选择编码方式的消息  void choiceEncoding_itemStateChanged(ItemEvent e) {    switch(choiceEncoding.getSelectedIndex())    {    case 0:                     // DVI/RTP 编码方式支持三种采样率      choiceSampleRate.removeAll();      choiceSampleRate.add("22050.0");      choiceSampleRate.add("11025.0");      choiceSampleRate.add("8000.0");      checkbox16Bit.setLabel("4 bit");      checkboxGroupBits.setSelectedCheckbox(checkbox16Bit);      checkboxGroupChannels.setSelectedCheckbox(checkboxMono);      checkbox8Bit.setEnabled(false);   // 该方式不支持给每个样本分配 8 bit 的编码      checkbox16Bit.setEnabled(true);   // 该方式支持给每个样本分配 4 bit 的编码      checkboxMono.setEnabled(true);    // 该编码方式支持单通道      checkboxStereo.setEnabled(false); // 该编码方式不支持双通道      break;    case 1:            // G723/RTP编码方式仅支持8000.0Hz采样率    case 2:            // GSM/RTP编码方式同上    case 3:            // ULAW/RTP编码方式同上      choiceSampleRate.removeAll();      choiceSampleRate.add("8000.0");      checkbox16Bit.setLabel("16 bit");      checkboxGroupBits.setSelectedCheckbox(checkbox8Bit);      checkboxGroupChannels.setSelectedCheckbox(checkboxMono);      checkbox8Bit.setEnabled(true);      if(choiceEncoding.getSelectedIndex() == 3 ) {        checkbox16Bit.setEnabled(false);        // ULAW/RTP方式不支持给每个样本分配 16 bit 的编码      }      else {        checkbox16Bit.setEnabled(true);      }      checkboxMono.setEnabled(true);      checkboxStereo.setEnabled(false);      break;    case 4:     // MPEGAUDIO/RTP编码方式支持四种采样率      choiceSampleRate.removeAll();      choiceSampleRate.add("48000.0");      choiceSampleRate.add("44100.0");      choiceSampleRate.add("22050.0");      checkbox16Bit.setLabel("16 bit");      checkboxGroupBits.setSelectedCheckbox(checkbox16Bit);      checkboxGroupChannels.setSelectedCheckbox(checkboxStereo);      checkbox8Bit.setEnabled(false);      checkbox16Bit.setEnabled(true);      checkboxMono.setEnabled(true);      checkboxStereo.setEnabled(true);      break;    }  }  // 得到用户选定的音频编码方式  public String getEncoding()  {    String encoding = null;    switch(choiceEncoding.getSelectedIndex()) {      case 0:        encoding = AudioFormat.DVI_RTP;        break;      case 1:        encoding = AudioFormat.G723_RTP;        break;      case 2:        encoding = AudioFormat.GSM_RTP;        break;      case 3:        encoding = AudioFormat.ULAW_RTP;        break;      case 4:        encoding = AudioFormat.MPEG_RTP;        break;    }    return encoding;  }  // 得到用户选定的音频采样率  public double getSampleRate()  {    double rateSample = 0;    switch(choiceEncoding.getSelectedIndex()) {      case 0:            // DVI/RTP编码方式支持三种采样率        switch(choiceSampleRate.getSelectedIndex()) {          case 0:            rateSample = 22050.0;            break;          case 1:            rateSample = 11025.0;            break;          default:            rateSample = 8000.0;        }        break;      case 1:      case 2:      case 3:        rateSample = 8000.0;        break;      case 4:        switch(choiceSampleRate.getSelectedIndex()) {          case 0:            rateSample = 48000.0;            break;          case 1:            rateSample = 44100.0;            break;          default:            rateSample = 22050.0;        }    }    return rateSample;  }  // 得到用户选定的每个样本的编码位数  public int getBitsPerSample()  {    int bitsPerSample = 0;    if(choiceEncoding.getSelectedIndex() == 0) {   // DVI/RTP编码方式仅支持 4bit 编码      bitsPerSample = 4;    }    else {          // 其他编码方式可选 8bit 或 16bit 编码      bitsPerSample = (checkboxGroupBits.getSelectedCheckbox() == checkbox8Bit) ? 8 : 16; ;    }    return bitsPerSample;  }  // 响应开始采集和传输按钮的点击消息  void buttonCaptureTransmit_actionPerformed(ActionEvent e) {    String strIPAddr = textIPAdd1.getText()+"."+textIPAdd2.getText()+"."+textIPAdd3.getText()+"."+textIPAdd4.getText();                     // 得到完整的IP地址    String strPort = textPort.getText();         // 得到端口号    String encoding = getEncoding();             // 得到编码方式    double rateSample = getSampleRate();         // 得到采样率    int bitsPerSample = getBitsPerSample();      // 得到每个样本的编码位数    int channel = (checkboxGroupChannels.getSelectedCheckbox() == checkboxMono) ? 1 : 2; ;    // 得到通道数    AudioFormat audioFormat = new AudioFormat(encoding,rateSample,bitsPerSample, channel);            // 根据用户的设置构造音频编码方式    Vector deviceList = CaptureDeviceManager.getDeviceList(new AudioFormat(AudioFormat.LINEAR));            // 得到音频采集设备列表    CaptureDeviceInfo di = null;    if (deviceList.size() > 0)                                 // 找到了合适的音频设备       di = (CaptureDeviceInfo)deviceList.firstElement();      // 选第一种音频采集设备作为本系统的采集设备    else       // 找不到合适的音频采集设备,则返回    {      System.err.println("Can't find a suitable audio capture device.");      return;    }    MediaLocator mediaLoc = di.getLocator();   // 由采集设备得到媒体定位    rtpTransmit = new RTPTransmit(mediaLoc,strIPAddr, strPort, audioFormat);           // 构造RTP传输类的对象    String result = rtpTransmit.start();        // 开始传输(同时也开始了采集)    if (result != null) {      // 如果开始传输不成功,则显示其返回的不成功原因      System.err.println("Error : " + result);    }    else {      System.err.println("Start transmission ...");    }  }  // 响应停止按钮的点击消息  void buttonStop_actionPerformed(ActionEvent e) {    rtpTransmit.stop();     // 停止传输(同时也停止了采集)    System.err.println("...transmission ended.");  }  // 关闭窗口,退出程序  void this_windowClosing(WindowEvent e) {    System.exit(0);  }  // 程序主函数  public static void main(String[] args) {    new AudioCapture();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -