快速业务通道

网页Applet录音机的制作 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
ecord=tt; } ... } } //缓冲数据提交事件类: import java.util.EventObject; public class AudioDataEvent extends EventObject{ ... } //事件侦听接口 import java.util.EventListener; public interface AudioDataListener extends EventListener{ public abstract void onAudioDataArrived(AudioDataEvent evt); }

网页Applet录音机的制作(2)

时间:2011-01-19

第二步,数据的编码压缩存储。由声卡采集的数据是一连串16位脉冲编码调制(PCM格式)的数据,数据量很大,如果不采取压缩处理,不利于文件的存储和传输。所以要进行数据的压缩编码,这就是我们会碰到的声音编码数据格式。压缩编码方法有很多种,有GSM、IAM4、AU格式编码等,这些压缩算法比较简单,可以在很多网站上获得压缩和解压缩的源代码。笔者对这几种压缩格式进行了测试,其主要参数及品质对比见上表。

压缩格式主要参数及品质对比

压缩格式 GSM IMA4 AU

压缩比 10:1 4:1 2:1

文件大小 很小 小 中

声音质量 一般 好 好

编解码速度 慢 快 很快

数据量(byte/s) 165 400 800

一般来说,人说话时并不是非常连续的,哪怕是你有意发连续的声音,其实有很多时间段是处在静音状态(没有声音或声音很小,量化数据值很小),只要记录它的一个状态就可以了。所以声音数据区的数据格式就是(数据头+数据体)的方式。对于静音数据,数据头为0,数据体为空。

在声音回放时,先读数据头,如果数据头不为0,则解压数据体播放;如果数据头为0,则暂停一定时间或者写入一定长度的静音数据即可。采用这种方式可以大大减小记录语音文件,并且不影响声音的还原回放。

//处理录音数据到达事件 public void onAudioDataArrived(AudioDataEvent evt){ ... int min=evt.getAudioMinValue(); fileWriter.write((min==0?0:1)); if(min!=0){ Convert.BytesToInts(evt.getAudioData(),audiodata); fileWriter.write(Codec.encode(evt.getAudioData())); } ... }

网页Applet录音机的制作(3)

时间:2011-01-19

第三步,声音采集编码保存结束后,就可以回放我们录制的声音。

接下来我们要在网页上来播放它。Java Applet支持AU格式声音的回放,使用非常简单。所以我们把录制并压缩的声音数据解码为AU格式,就可以很方便地进行声音回放了。在sun.audio包中提供的au流数据播放sun.audio.AudioPlayer.start(InputStream),实际上是虚拟机的au播放类每隔50毫秒依次调用InputStream的read(byte[],abyte0,int i,int j)方法,每次读取长度为400字节的AU格式数据用来播放。我们知道,输入流的read方法是阻塞方式的,而解压缩声音数据是要费时的,如果在其请求数据时再解压数据并写入缓冲区,则播放声音时听起来会断断续续的,那是不可行的。所以需要单独建立解压缩数据的线程,也就是说从虚拟机的au播放类读取数据的线程中独立出来,用缓冲区做为两个线程的管道连接,解压缩线程不停地写入缓冲区中,播放线程不断地从缓冲区中读取并播放。这样一来,对于播放声音的暂停、停止等功能就很容易实现。所以我们需要重载read(byte[],abyte0,int I,int j)方法。

//音频缓冲区类 import java.io.*; public class AudioBuffer extends InputStream{ int capacity=4096; ... public AudioBuffer(AudioPlayer ap){ player=ap; clearData(); } public void close(){ isclose=true; synchronized(putManager){ if(waitingPut>0)putManager.notify(); } synchronized(getManager){ if(waitingGet>0)getManager.notify(); } } public void clearData(){ ... } public void suspend(){ispause=true;} public void resume(){ispause=false;} public void write(int i){ synchro

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号