新闻中心

EEPW首页>嵌入式系统>设计应用> 嵌入式以太网数字语音广播系统技术设计

嵌入式以太网数字语音广播系统技术设计

作者: 时间:2010-05-11 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/151868.htm

  3软件

软件分为服务器端软件和播放终端软件两部分。

  该实现数据的实时播放,所以要求数据传输的实时性得到保障,而对于数据的完整性要求不是太严格,少量的丢包也不会影响整体的播放效果,所以该系统的数据传输采用UDP传输方式,同时本系统工作在局域网内,临时用户较少,故采用IP地址静态分配,简化播放终端软件部分的实现。

  3.1 广播系统服务器端语音数据的采集、存储与发送

  语音数据的采集利用低层WAVE音频API函数实现,为了不造成语音数据的丢失,该利用双缓冲来存储语音数据,实现流程如图3所示。

  当一个录音缓冲区满时,系统立刻将另一个录音缓冲区发送给录音设备继续录音,而应用程序此时要读取已经录音满的缓冲区中的数据,并进行处理。然后调用waveInAddBuffer函数将该缓冲区重新赋给录音设备,循环利用。

  为了防止录音过程中语音数据的丢失,只是简单地利用双缓冲是不够的,还要注意的一点是,当一个缓冲区录音满以后,应用程序对该缓冲区的数据进行处理,同时第二个缓冲区用于录音,数据处理的时间一定要小于第二个缓冲区录音满需要的时间,否则在第二个缓冲区录音满以后第一个缓冲区还没有重新赋给录音设备,就会造成语音数据的丢失。当语音信号采样率大的时候适当增加缓冲区的大小,可以有效地解决这个问题。

  为了将广播的内容进行保存以备后需,需要将广播内容保存在一个WAV文件中。WAV文件具有固定的头格式,在保存语音数据之前,需要先将WAV文件的头部设定好,否则保存的WAV文件无法播放。在每一次录音缓冲区满时,首先找到WAV文件的结尾处,然后将采集到的数据依次写在文件尾部。当整个广播过程结束时,所有的语音数据都被保存在了WAV文件中,实现了语音数据的存储。

  当一个录音缓冲区满后,这时就需要将已经采集到的语音数据通过网络发送出去。在设计中首先利用Csocket类创建一个套接字,接下来只需要将采集到的数据封装成IP包发送出去。该设计中语音信号的采样率为44.1 kHz,16位双声道。为了避免语音数据丢失,录音缓冲区的大小设定为1024B。

  3.2 区域广播的实现

语音广播系统的一个重要应用就是不仅可以实现全区广播,同时可以实现局域广播功能,即对指定的终端进行广播。因此,在语音IP数据包的网络传输中采用UDP组播包的形式进行数据传输。采用组播包传输数据,在局域网内所有包含在该组中的终端都可以接收到数据,实现全区广播。为了实现局域广播功能,该设计中在语音数据前面添加了一个结构体,如下所示,同时还有一个配置文件用于存储系统各终端的IP地址。

  struct STRING

  {String IPNO1;

  String IPNO2;

  …

  String IPNO9;

  String IPNO10};

  当需要对某几个终端进行区域广播时,在广播系统服务器端的面板上(如图4所示)将这几个终端对应的编号选上。这时就将被选中终端的IP地址从配置文件中读出并赋给该结构体中对应的变量。当终端接收到IP组播包时,首先判断该结构体是否有和自己的IP地址相同的变量,如果有,则进行数据的接收播放,如果没有则对数据进行丢弃处理,这样就实现了区域广播功能。相对于采用控制信号控制播放终端加入或者离开组播组,或者通过动态维护复杂的映射表以实现区域广播功能的方法。该方法不需要在每次广播之前对播放终端进行交互控制,也不需要动态跟踪终端状态,只需要在终端第一次加入系统时将终端对应的IP地址写入配置文件即可,功能实现简单。

  3.3 广播系统播放终端软件的实现

  广播系统播放终端分为两个部分来实现,音频数据接收部分用于接收语音数据并进行存储转发,音频解码器实现语音信号的D/A转换并播放。音频数据接收部分采用Socket编程实现从上接收语音数据,在接收到语音数据包以后,首先要对数据包进行判断,是否是发给自己的数据包。终端通过将IP包中结构体struct STRING的成员变量与自己的IP地址进行比较,如果有成员变量和自己的IP地址相等,则存储该数据包中的数据,否则丢弃。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭