answer machine简单的使用

本文介绍使用Java实现组播音频的基本方法。通过AMAudioFormat、AudioCapture和AudioPlayStream等类,结合开源库和标准API,实现音频捕获、封装为数据包并通过网络发送,接收端则解包并播放。
     前段时间用java写一个组播音频的作业,发现网上资料并不多见。同学中有人用JMF搞定,我则在网上找到一些利用javax.sound完成此功能的文章。这里介绍一下最基本的一些操作。

     首先,可以去国外网站下载一个开源的软件包,该包内将java的一系列音频API进行了封装,方便我们使用,省去了自己写一堆初始代码的麻烦。该包的名字为am-src,网上搜一下肯定能找到的。我使用了这个包里名为AMAudioFormat,AudioCapture和AudioPlayStream三个文件。这三个文件分别实现了音频格式定义、音频获取和音频播放三个功能。

     在AMAudioFormat中定义了用于GSM、FM等的四种音频格式,这里使用GSM。为了使用GSM音频,还需要下载名为tritonus_share和tritonus_gsm的jar包,并将其添加在你的工程库中。下面对三个java文件进行一下简单的解释。

     AMAudioFormat内定义了音频的一系列参数,在使用过程中若你直接调用AudioCapture则不需过多关心此类,这里不详述,可自行阅读源代码。

     AudioCapture定义了获取某种音频格式的方法,在对其实例化时需传递音频格式参数(AMAudioFormat中定义有的类型)。该类中的getAudioInputStream()和open()函数用于获取音频流和打开音频流,是程序中需要调用到的操作。在新建了一个实例后,调用open()操作,然后利用getAudioInputStream()返回的AudioInputStream就可进行音频的获取了。

     AudioPlayStream与AudioCapture类似,这里不再详述。

     由于是要对音频进行组播,所以需要将音频截获为一个一个的数据包,可以利用AudioInputStream的read()操作来实现。下面给出一个简单的获取并发送的例子。

 

cap=new MyAudioCapture(MyAudioFormat.FORMAT_CODE_GSM); 
buffer
=new byte[16384]; 
ausend
=new MulticastSocket();

cap.open(); 
cap.start(); 
mystream
=au_cap.getAudioInputStream(); 
while(!Thread.interrupted())
      mystream.read(buffer,
0,buffer.length); 
      DatagramPacket packet
=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("239.0.0.1"),12345); 
ausend.send(packet); 
}


下面是一个接收到组播音频后播放的例子。

 

receiver=new MulticastSocket(12345); 
play
=new MyAudioPlay(MyAudioFormat.getLineAudioFormat(MyAudioFormat.FORMAT_CODE_GSM)); 
buffer
=new byte[16384];

receiver.joinGroup(InetAddress.getByName(
"239.0.0.1")); 
play.open(); 
play.start(); 
while(!Thread.interrupted())
        DatagramPacket packet
=new DatagramPacket(buffer,buffer.length); 
        rec.receive(packet); 
        play.write(packet.getData(),
0,packet.getLength()); 
}


以上是极为简单的例子,是在我自己程序上摘录修改的,未经测试,可能会有错误。

另:由于使用的是开源代码,所以使用中请您遵守相关的协议。协议在源码包中有所说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值