APP下载

一种确保在WinCE系统中传输.wav文件完整性的方法

2015-05-29王忠

现代电子技术 2015年10期

王忠

摘 要: 使用WinCE系统的智能手持终端,在不稳定的无线网络环境中使用UDP协议发送wav格式的音频文件时,另一台WinCE智能设备接收到的文件经常是不完整的,导致文件无法播放。针对这种网络数据丢包现象,研究提高UDP协议可靠性的设计思路和实现方法,发现.wav文件头中标识文件属性的数据无法与接收到的文件数据实体对应,是造成无法正常播放的根本原因,因此对接收的文件的文件头进行校正和复原工作,保证头文件的各标识位对应数据的正确性,确保接收的声音文件能正常播放。最后在嵌入式开发环境中进行了实现,验证了这种方法的有效性。

关键词: WinCE; UDP; wav文件; 智能手持终端

中图分类号: TN911?34 文献标识码: A 文章编号: 1004?373X(2015)10?0049?03

0 引 言

WinCE是一个开放的嵌入式操作系统,是一种应用于手持智能终端的成熟的操作系统。在数据传输网络中,UDP协议与其他协议相比,在速度上有一定的优势,但也存在传输可靠性差的问题,因为UDP协议不提供数据传送的保证机制。如果从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示,也不进行恢复。所以要想提高UDP协议的可靠性与安全性,就必须增加差错处理、拥塞控制和安全控制等机制。在采用WinCE系统的手持智能设备中,由于经常是在不稳定的无线网络环境中使用,当上层应用程序使用UDP协议传输wav音频文件时,另一台设备接收到的wav音频文件由于丢包,经常无法正常播放,就失去了发送wav文件的意义。针对这种现象,研究使用WinCE系统的智能设备如何采用一种简便易行的方法,保证wav文件能正常播放。

1 发送与接收过程分析

通过对UDP协议的研究,发现使用UDP协议在网络传输过程中丢包是造成wav文件有损传输的主要原因;凡是不能正常播放的wav文件,其文件头中标识文件属性的数据无法与接收到的wav文件数据实体对应 [1]。

WinCE系统使用UDP协议发送与接收wav文件,需要开启两个线程[2],一个线程处理发送业务,一个线程处理接收业务。发送业务的处理主要是从麦克风获取的wav文件进行处理,在发送之前抛弃wav文件的文件头。这个处理过程的流程如图1所示。

图1 发送线程的处理流程

接收线程的主要是完成wav文件的接收。在接收之前需要先创建wav文件头,然后把接收接收的数据放到已创建的wav头之后,等待接收完成后对wav文件头校正,保证wav文件的头中的信息与wav文件是对应的[3?4]。接收线程的处理流程如图2所示。

图2 接收线程的处理流程

2 发送接收文件的实现过程

2.1 使用UDP协议发送之前的处理

通过对wav文件格式的研究发现,其文件头的大小是44个字节,为了使处理更简单,在开始传输之前,先要将wav文件读入文件流中,舍弃文件头的44个字节,从44个字节之后开始传输[5?6],主要实现代码如下:

FileStream SoundStream = new FileStream(SoundPath, FileMode.Open); //创建文件流

SoundStream.Seek(44, SeekOrigin.Begin);

//将文件流的开始位置放到第44个字节之后

2.2 使用UDP协议接收过程

缺失了wav文件头的音频文件无法在WinCE设备上播放,在接收到音频文件之前需要创建wav文件头,在接收的过程中再把接收到的音频数据写入到创建的文件头后面[7?9]。

///

///创建wav文件

///

///

private void CreatewaveFile(string strFileName)

{

fswav = new FileStream(strFileName, FileMode.CreateNew);

mWriter = new BinaryWriter(fswav);

char[] ChunkRiff = { ′R′, ′I′, ′F′, ′F′ };

char[] ChunkType = { ′W′, ′A′, ′V′, ′E′ };

char[] ChunkFmt = { ′f′, ′m′, ′t′, ′ ′ };

char[] ChunkData = { ′d′, ′a′, ′t′, ′a′ };

short shPad = 1;

int nFormatChunkLength = 0x10;

int nLength = 0;

short shBytesPerSample = 1;

short SChannels = 1; //声道 单声道为1

int SamplesPerSecond = 11025;

//采样率采样率(单位:赫兹)典型值:11 025,22 050,44 100 Hz

short BitsPerSample = 8; //采样位数8或16

short BlockAlign = (short)(SChannels * (BitsPerSample / 8));

//单位采样点的字节数

int AverageBytesPerSecond = BlockAlign * SamplesPerSecond; // RIFF 块

mWriter.Write(ChunkRiff); //4 B

mWriter.Write(nLength); //4 B

mWriter.Write(ChunkType); //4 B

//wavE块

mWriter.Write(ChunkFmt); //4 B

mWriter.Write(nFormatChunkLength); //0x10 4 B

mWriter.Write(shPad); //2 B

mWriter.Write(SChannels);

mWriter.Write(SamplesPerSecond); //采样率

mWriter.Write(AverageBytesPerSecond);

mWriter.Write(shBytesPerSample);

mWriter.Write(BitsPerSample); //数据块

mWriter.Write(ChunkData);

mWriter.Write((int)0);

}

创建时要根据发送方发送的音频文件的声道数,采样率,采样位数对其中的数据进行修改。在传输完成后,还需要改变wav文件头中标识音频文件大小的数据[10]。

private void WriteSoundTail()

{

string SoundPathRecv = CodePath +

"\\tape\\aa\\Soundrecvwav";

long Fsize = new FileInfo(SoundPathRecv).Length;

mWriter.Seek(4, SeekOrigin.Begin);

mWriter.Write((int)Fsize?8);

mWriter.Seek(40, SeekOrigin.Begin);

mWriter.Write((int)Fsize?44);

mWriter.Close();

mWriter = null;

fswav = null;

}

3 结 语

wav文件头包含了wav音频文件的属性信息,因此使用UDP协议传输wav文件,要保证音频文件能正常播放,就需要对wav的文件头进行校正和复原处理。在实际使用UDP协议处理过程中,还有很多要注意的地方,比如使用UDP协议传输时数据报的长度有一定的限制。

参考文献

[1] 王颀,赵世刚,张春寿.WAV文件的结构剖析[J].济南教育学院学报,2000(3):29?31.

[2] 郭兴吉. WAV波形文件的结构及其应用实践[J].微计算机信息,2005,21(8):114?116.

[3] 王雪莉,卢才武,顾清华.无线定位技术及其在地下矿山中的应用[J].金属矿山,2009(4):121?125.

[4] 陈昕志,王昆.基于嵌入式WinCE 6.0的网络电视播放器研究[J].电视技术,2011,35(10):83?85.

[5] 何宗键.Windows CE嵌入式系统[M].北京:北京航空航天大学出版社,2006.

[6] 李晓燕,严殊.嵌入式流媒体播放器的设计与实现[J].通信技术,2007,40(12):403?404.

[7] 周锦才.可靠UDP协议的设计思路与实现方法[J].周口师范学院学报,2006,23(2):104?108.

[8] 王继刚,顾国昌.可靠UDP数据传输协议的研究与设计[J].计算机工程与应用,2006,42(15):113?116.

[9] 靳海力,李俊.具有补发机制的增强型可靠UDP的实现[J].小型微型计算机系统,2010,31(5):904?907.

[10] 万国府,刘贵全.卫星网络中基于UDP的可靠数据传输协议[J].通信技术,2007,31(6):64?66.