网站首页  词典首页

请输入您要查询的论文:

 

标题 一种确保在WinCE系统中传输.wav文件完整性的方法
范文 王忠
摘 要: 使用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.
随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/2/10 23:39:52