如何捕获音频及输出音频
2005-07-29 15:52
239 查看
如何捕获音频及输出音频。 | |
构造器里的socket是用来接受来自网络的音频数据。不做网络音频可以去掉它。 希望能与大家分享经验。8-) import java.io.*; import javax.sound.sampled.*; import java.net.*; /** * Title: VoiceChat * Description: 输出音频(放音程序) * Copyright: Copyright (c) 2001 * Company: * @author 你猜! * @version 1.0 */ class Playback implements Runnable { final int bufSize = 16384; SourceDataLine line; Thread thread; Socket s; Playback(Socket s){//构造器 取得socket以获得网络输入流 this.s=s; } public void start() { thread = new Thread(this); thread.setName("Playback"); thread.start(); } public void stop() { thread = null; } public void run() { AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian) BufferedInputStream playbackInputStream; try { playbackInputStream=new BufferedInputStream(new AudioInputStream(s.getInputStream(),format,2147483647));//封装成音频输出流,如果网络流是经过压缩的需在此加套解压流 } catch (IOException ex) { return; } DataLine.Info info = new DataLine.Info(SourceDataLine.class,format); try { line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, bufSize); } catch (LineUnavailableException ex) { return; } byte[] data = new byte[1024];//此处数组的大小跟实时性关系不大,可根据情况进行调整 int numBytesRead = 0; line.start(); while (thread != null) { try{ numBytesRead = playbackInputStream.read(data); line.write(data, 0,numBytesRead); } catch (IOException e) { break; } } if (thread != null) { line.drain(); } line.stop(); line.close(); line = null; } } import java.io.*; import javax.sound.sampled.*; import java.net.*; /** * Title: VoiceChat * Description: 音频捕捉(录音程序) * Copyright: Copyright (c) 2001 * Company: * @author 你猜! * @version 1.0 */ class Capture implements Runnable { TargetDataLine line; Thread thread; Socket s; BufferedOutputStream captrueOutputStream; Capture(Socket s){//构造器 取得socket以获得网络输出流 this.s=s; } public void start() { thread = new Thread(this); thread.setName("Capture"); thread.start(); } public void stop() { thread = null; } public void run() { try { captrueOutputStream=new BufferedOutputStream(s.getOutputStream());//建立输出流 此处可以加套压缩流用来压缩数据 } catch (IOException ex) { return; } AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian) DataLine.Info info = new DataLine.Info(TargetDataLine.class,format); try { line = (TargetDataLine) AudioSystem.getLine(info); line.open(format, line.getBufferSize()); } catch (Exception ex) { return; } byte[] data = new byte[1024];//此处的1024可以情况进行调整,应跟下面的1024应保持一致 int numBytesRead=0; line.start(); while (thread != null) { numBytesRead = line.read(data, 0,1024);//取数据(1024)的大小直接关系到传输的速度,一般越小越快, try { captrueOutputStream.write(data, 0, numBytesRead);//写入网络流 } catch (Exception ex) { break; } } line.stop(); line.close(); line = null; try { captrueOutputStream.flush(); captrueOutputStream.close(); } catch (IOException ex) { ex.printStackTrace(); } } } |
相关文章推荐
- python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中
- 如何执行本地程序并捕获out和err输出(written in Java)
- 输出音频和捕获音频
- 如何用蓝牙耳机连接xp输出音频
- [ZT]如何在图形界面中实时捕获控制台程序的标准输出,让图形界面程序向控制台程序输入特定的命令行指令
- [导入]java中如何执行本地程序并捕获out和err输出
- Android如何实现音频输出切换
- java中如何执行本地程序并捕获out和err输出
- NVIDIA Jetson TK1学习与开发:如何解决输入和输出音频问题
- 如何在JS中捕获console.log()的输出
- NVIDIA Jetson TK1学习与开发:如何解决输入和输出音频问题
- 如何修改pcDuino系统默认的音频输出
- java与面向对象---2.8 捕获音频及输出音频
- NOIP比赛中如何加速c++的输入输出
- 如何设置ofbiz的日志输出级别
- c++类中重载输出和输入符号的时候如何处理枚举数据
- 如何修改Asf Writer中的profile,以达到改变输出屏幕大小?
- 如何捕获DDL记录
- python如何格式化输出百分号
- 如何捕获系统外异常