📄 audiocapture.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 + -