用Java实现网络语音信号传送
http://www.doozz.com 2008-01-05 00:00
一、引言
Java是一门适合于分布式计算环境、尤其是Internet程序设计的语言。这不仅仅在于java具有很好的安全性和可移植性,还在于java为Internet编程提供了丰富的网络类库的支持。利用这些网络类库,可以轻松编写多种类型的网络通信程序。
然而由于某些限制,Java在传输多媒体信息方面的应用不是很广,大部分的应用都集中在网络上传输语音等音频信号的方面。传输音频信号应用方案一般有两种,一是应用于数据广播的多对一传输,例如音频数据服务器向数个客户端发送音频数据信号,其最广泛的应用则是某些网上的IP电话,大家经常可以看到不少这种提供在线IP电话服务的网站的客户端都是使用的嵌在网页上的Java Applet程序,用来实现拨号、通话等等基本的网络电话功能; 第二种方案则是我们今天要涉及的部分,一对一的音频信号数据的传输。这种方案的应用范围更广。大家都去过语音聊天室,大部分的语音聊天室的语音聊天功能的实现就是使用的Java技术,大家对这样网页的源代码分析一下就可以发现这一点。
我曾开发一个项目,涉及使用java来实现在网络上传输语音数据。开发中碰到不少问题,而且在互联网上发现关于java语音传输的资料比较少,寻找了许多天,最终从一个开放源代码的一个简单的Answer Machine 演示程序中获得了解决问题的方法。今天我就把我在点对点传输音频信号方面的一些经验拿出来,与大家共同探讨这方面的问题。
二、存在的问题
在网络上传输音频的方面存在的问题主要可以归纳为以下几点:
1 双方之间的网络连接
要进行频数据的传输,首先就是要建立数据连结。常用的通讯协议中,TCP较可靠,所以用在不答应数据丢失的应用上。而UDP则较多应用于处理速度要求较快、数据传输可靠性要求不是很高的应用上,如数据广播。通信协议的选择取决于我们所要做的应用的类型。怎样建立网络连接,稳定的接收和发送音频信号的数据流是要害。
2 音频信号的采集以及回放
在进行音频信号的采集中我们必须考虑到采样率的问题,声音信号的采样率有8Khz、16Khz、32Khz、44Khz等,每种数据采样虑产生的数据量都不一样,越高的采样率产生的数据量越大,所以我们要选择合适的采样率以适应网络的带宽。
3 音频数字信号的编码与解码。
假如把直接采集到的音频信号数据流在网络上进行传输,它所占有的带宽也是十分大的,以8Khz的采样率采集14位的音频数据那么就有以下这样的一个式子:
14 bit * 8000/second=112,000 bits/second or112kbps
从中我们可以看出以这样的方式传输音频数据,每秒需要向网络中发送112kb的数据。所以。从节省带宽的角度考虑,我们很有必要对这样的数据进行压缩。对多媒体信号的压缩我们有许多可以选择的格式,如mp2、mp3、GSM等等。同样,我们这里也存在一个对压缩格式进行选择的问题,考虑到音频数据传输的及时性,对传输的音频数据质量的要求,以及各种压缩格式的压缩比率以及进行压缩和解压缩所要耗费的系统资源等方面问题,选择合适的压缩格式就显得尤为重要。 三、解决的方法
下面就针对前面提出的问题讨论一下解决的办法。
1 双方之间的网络连接
Java在这方面有其独特的优势,Java提供了丰富的网络类库的支持,可以轻松编写多种类型的网络通信程序。在我下面的例子中我就使用了TCP/IP协议,通过Java的Socket类进行编程。
2 音频信号的采集和回放以及音频数字信号的编码与解码
在解决这两个问题的时候,在网上很幸运地通过一些文章的介绍,找到了Answer Machine 演示程序的源代码(由of jsresources.org的Florian Bomers 和Matthias Pfisterer编写,网址http://www.jsresources.org/apps/am.Html)。在这个程序代码中,有几个解决我们问题所需要的类,而且作者将这些类封装的很好,我们基本不需要做什么改动,只需要屏蔽其中的调试信息的输出就行了,更可贵的是它还封装了几种常见的音频格式。其中的GSM格式(Global System for Mobile Telecommunications)就是我们下面例子中采用的压缩格式,GSM格式可以将128kbps 的音频数据流 (16bit通过8k Hz的音频采样) 压缩为13kbps 的音频数据流,非常适合语音信号的传送,所以可谓是一石二鸟。
我分析过这几个类的源代码,不得不佩服它的作者,每个类的源代码都很精炼,大家可以自己分析一下。好了下面就给大家讲讲这几个类,并且将它们用到的Java Sound API中的类和函数等一并做个简单介绍,让大家对Java Sound API中常用的类也有个大致的了解。由于Java Sound API中的类比较多。限于篇幅无法对所有用到的类做详尽的解释,以下内容只是简单提及了各个类的用途和使用规范,有关Java Sound API中类的具体介绍请大家访问这里http://java.sun.com/j2se/1.4.2/docs/api/, 查找javax.sound.sampled的相关内容。
以下的提到几个文件是从Answer Machine 演示程序的源代码中提取出来的,由于是开放源代码的程序,大家在使用的时候请注重相关的公共协议。
① AMAudioFormat类(封装在AMAudioFormat.java文件中)
AMAudioFormat类封装了CD、FM、TELEPHONE、GSM这四种质量的音频格式的参数,使用起来也非常简单,这样我们在使用Java Sound API时就不用自己去写那些复杂的代码了,但为了明白Java Sound API的原理,我们需要对它的代码做一下分析。它使用了Java Sound API中的AudioFormat这个类,这个类非常重要,在Java中对任何音频数据的使用都要实现通过它指定所需要使用的音频格式,AudioFormat类有一个嵌套的类AudioFormat.Encoding,实际上大部分对AudioFormat类的使用都是使用的这个嵌套的类。
AMAudioFormat类的重要方法:
名称:getLineAudioFormat
调用格式:getLineAudioFormat(整型音频格式代号)
返回值: 根据传递音频格式代号生成的AudioFormat对象。
说道这里大家可能要问了,那么通过Java Sound API可以直接使用GSM格式吗?答案是比较复杂,但同样有解决的办法,作者在这里使用了另外的开源程序的类库-tritonus的GSM编码解码库。大家需要在这里www.tritonus.org/plugins.html下载tritonous_share.jar和tritonus_gsm.jar两个文件,并在AMAudioFormat类中引用,这样就完成了GSM格式的设置。需要告诉大家的是在对AMAudioFormat.java这个类进行编译后,我们的程序运行的时候就可以不需要tritonous_share.jar和tritonus_gsm.jar这两个文件的支持了。
② AudioCapture类(封装在AudioCapture.java文件中)
AudioCapture类封装了从音频硬件捕捉音频数据并自动编码为GSM音频压缩数据的过程,并且通过它的getAudioInputStream()方法提供给我们一个音频数据输入流,我们就可以直接将这个流发送到网络中。
AudioCapture 类的重要方法:
名称:getAudioInputStream
调用格式:getAudioInputStream()
返回值:AudioInputStream对象
AudioCapture 类使用了Java Sound API中的AudioInputStream、AudioFormat、AudioSystem这几个类和TargetDataLine、LineListener接口。除了AudioFormat类我再简单介绍一下其他的类:
AudioInputStream 类是带有非凡音频格式和长度的InputStream类,它有两个构造方法,分别是AudioInputStream(InputStream stream, AudioFormat format,long length)和AudioInputStream(TargetData -Line line)。
TargetDataLine 接口是DataLine接口的一种,通过它就可以直接从音频硬件获取数据了,它有几个常用的方法,分别是:open(AudioFormat format)、void open(AudioFormat format, int bufferSize)、int read(byte[] b, int off, int len)。
AudioSystem 类是Java标准音频系统的入口点,在AudioSystem 类中使用他的getLine() 方法创建TargetDataLine对象。
LineListener接口用来对线路状态改变的时间进行监听,他的重要的方法是update(LineEvent event)方法。
③ AudioPlayStream类(封装在AudioPlayStream.java文件中)
AudioPlayStream类与AudioCapture类刚好相反,它封装了GSM压缩音频数据的解码和音频信号的回放过程,提供给我们一个音频信号输出流。AudioCapture类用到的Java Sound API中的类它也基本都用到了,只是它使用了SourceDataLine接口而不是TargetDataLine接口
④ Debug类(封装在Debug.java文件中)
Debug类主要用来在调试时输出讯息,代码很少,后来我把其中输出信息的语句都屏蔽了,对程序运行没有影响。
为了方便使用以上的几个类,我们需要对它们进行编译和打包,编译时需要设置相关的编译环境,以下是我们需要用到的命令行
set CLASSPATH=%CLASSPATH%;.;tritonus_gsm.jar;tritonus_share.jar
javac am\*.java am\audio\*.java
jar cmf packaging\manifest.mf am.jar am\*.class
am\audio\*.class
说明一下,我将以上提到的Java源码文件放在了am目录下,编译之后可以得到一个8k的am.jar文件,我们下一步所需要做的就是在我们的程序中引用这个包。
四、实例介绍
有了以上的基本的介绍,我就可以通过对我写的一个极为简单的语音对讲软件代码的解释让大家更清楚地了解一下这几个模块的具体使用方法,大家可以从中获得开发具有诸如网络电话、自动应答等功能的软件的类似方法,用于语音数据的传输。
程序的结构:
整个程序分三层,作用分别如下:
. 顶层: 用户界面
. 中间层: 控制层
. 底层: 传输层
程序有两个主要的类: (表)
类名描述 CallLink 网络传输层,用于接收或发送音频数据。 VoiceSender 作为第二个启动的线程提供从音频硬件捕捉并编码好的数据给网络传输层。
分享到:
相关推荐
在IT领域,网络视频传输控件是用于在应用程序中实现实时或非实时视频流传输的关键组件。在本例中,我们关注的是一个基于Visual C++(简称为VC++)开发的控件,专用于处理网络视频的传输。VC++是微软推出的一种面向...
基于DirectShow的网络视频传输实现,主要涉及以下几个关键知识点: 1. **DirectShow架构**:DirectShow是一个层次结构的组件对象模型(COM),由过滤器和过滤器图形组成。过滤器负责特定的媒体处理任务,如解码、...
【C++网络视频传输服务器端程序】是一种使用C++编程语言构建的应用,旨在处理网络上的视频数据传输。这种服务器程序通常用于实时视频流服务、在线教育平台、远程监控系统等场景,通过网络将视频内容从服务器传送到...
以下将详细介绍网络视频传输交换机的相关要求,以及如何根据不同的层级来配置合适的设备。 首先,网络型数字视频安防监控系统的网络交换层不应超过三级。这样的设计有助于保持网络结构简洁,提高数据传输效率,并...
NetVideo网络视频传输控件是一种专门用于在网络环境中实现视频数据传输的软件组件。它提供了高效、稳定且用户友好的方式来处理视频流,是开发多媒体应用程序,如在线视频播放平台、远程监控系统或实时视频通信应用的...
在IT领域,网络视频传输是现代通信技术的重要组成部分,尤其在网络娱乐、远程教育和企业协作等方面发挥着关键作用。本文将深入探讨一个基于C++语言,利用Visual C++ 6.0(VC6)编译环境开发的网络视频传输客户端程序...
网络视频传输与交换是现代信息技术中非常重要的部分,尤其在网络视频监控领域,它涉及到视频信号的采集、编码、传输、交换以及最终的显示等多个环节。在本次分享中,我们关注于网络视频监控系统的结构特点、视频压缩...
NetVideo网络视频传输控件是IT领域中一种用于在网络环境中实现视频流传输的软件组件。这个控件的主要功能是提供实时的视频播放和录制服务,它使得开发者能够轻松地在应用程序中集成网络视频功能,例如在线教育平台、...
网络视频传输的源程序涉及到多个关键技术领域,包括视频编码、网络传输协议以及源代码实现。在本文中,我们将深入探讨这些关键概念。 首先,我们关注的是视频编码技术。MPEG-4是描述数字音频和视频编码标准的一个...
《网络游戏中的网络视频传输与播放系统及方法》 在当今数字化时代,网络游戏已经成为了人们娱乐生活的重要组成部分。其中,网络视频传输与播放系统的应用更是为游戏体验增添了丰富的视听元素。本压缩包文件“网络...
标题中的“关于如何建立一个MPEG4的网络视频传输系统”揭示了这个项目的核心目标,即构建一个基于MPEG4编码标准的网络视频传输系统。MPEG4是一种高效的数字视频编码标准,它允许在有限带宽下传输高质量的视频流,...
《H.264网络视频传输系统的实现和优化》这篇文档深入探讨了现代网络视频传输技术的核心——H.264编码标准以及如何在实际应用中对其进行优化,以提高视频质量和传输效率。以下是对该主题的详细阐述: H.264,全称ITU...
标题中的“网络游戏-一种基于DM365的网络视频传输系统及方法”表明这是一个关于网络游戏技术,特别是视频传输系统的主题,而这个系统是构建在DM365平台上的。DM365是一款由Texas Instruments(TI)公司推出的数字...
本资源是基于 UDP 协议与 OpenCV 库实现网络视频传输的实现代码,使用 Python 语言实现,分为服务器端和客户端两个文件,启动前需要修改 host IP 地址为实际的 IP 地址,同时需注意先运行服务器端代码,再运行客户端...
"网络视频传输与交换" 本章节主要介绍了网络视频传输与交换的相关知识点,涵盖了网络视频监控系统的结构、MPEG-4技术、视频传输、OSI模型、传输层、TCP与UDP协议、RTP与RTCP协议、RTSP与RTVP协议、网管协议SNMP、流...
总的来说,这篇论文探讨了基于嵌入式Linux的Ad-Hoc网络视频传输技术,涵盖了系统构建、驱动程序开发、无线通信以及视频流处理等多个方面,对于理解嵌入式系统开发和无线通信技术有重要的参考价值。同时,它强调了Ad-...
中南大学电子信息工程14级专业专题课件:网络视频传输关键技术。
网络视频传输activeX控件,可用于局域网或宽带网的视频压缩传输.包括视频的采集、压缩、传输、解压、回显,可在任何支持activeX空间的语言中使用,也可用于WEB网页中。