wince网络音视频通讯
下位机为 mini2440 ,其操作系统是WINCE 5.0,需要在下位机上插入USB摄像头(中星微301,驱动为15分钟限制版),以及插入麦克风耳机;
上位机为普通的PC,需要插入麦克风耳机;
上位机和下位机的开发环境为Visual Studio 2005。
接下来,说说这个东东的功能,和工作原理:
网络视频传输,首先把mini2440与USB摄像头连接在一起,通过USB摄像头捕捉图像(320 x 240,15fps),然后通过UDP协议发送至PC端,在PC屏幕上以15fps的速度显示。
网络音频传输,首先在mini2440和PC上都插入麦克风耳机,两者都同时录音,并以G.726编码,然后把压缩包通过UDP协议发送至对方,而在录音的同时,也对来自对方的压缩包用G.726解码,然后再在耳机播放音频。
最后,说说这个版本相对于以前的改进:
把以前的RTP改为UDP,实践证明,在这个系统中,用UDP的效率会比RTP好,毕竟不需要用到RTP的流量监测等高级功能,仅仅能通信就行了;
以前版本基于100M网卡,现在支持10M网卡了,在100M网卡的机器上,可以直接把JPEG图片发过去,但是,在10M的网卡是,每次数据包最大为1440比特,因此要兼容10M网卡,就需要把图像分割成多个1440大小的数据包,分别发送了。
网络音视频通信
下面说说关键的源代码:
以下是WINCE部分的代码
#pragma once
#include “winsock2.h”
//RTP支持
#include “。.UDPUDP.h”
//音频支持
#include “WaveIn.h”
#include “WaveOut.h”
//G726支持
#include “g726.h”
//摄像头支持
#include “。video\zc030xlib.h”
#define Video_Width 320 //视频宽度
#define Video_Height 240 //视频长度
#define AudioData_Size 960 //每块音频数据包的大小
#define Compr_AudioData_Size 120 //压缩后音频块的大小
//音频输入输出变量
CWaveIn *g_pIn;
CWaveOut *g_pOut;
char pin[AudioData_Size],pout[Compr_AudioData_Size];
char waveout[AudioData_Size];
//摄像头输入变量
DWORD dwSize;
DWORD dwJpg;
DWORD dwRtnSize[2];/* 0 - for bmp, 1 - for jpeg */
LPBYTE lpFrameBuffer;
LPBYTE lpJpgBuffer ;
//控制变量
bool isCameraEnabled;
//UDP
CUDP_CE m_CEUdp;
class AVClass
{
public:
//=====================================================================
// 语法格式: void InitAV(CWnd * p)
// 实现功能: 初始化音频和视频,用于录音、播放音频,以及播放视频
// 参数: p为窗口类指针
// 返回值: 无
//=====================================================================
void InitAV(CWnd * p,int local_port,CString remote_ip,int remote_port)
{
//-----------------------初始化UDP-----------------------//
m_CEUdp.m_OnUdpRecv = OnUdpCERecv;
DWORD nResult = m_CEUdp.Open(p,local_port,remote_ip,remote_port);
if (nResult 《=0)
{
AfxMessageBox(_T(“打开端口失败”));
return;
}
//------------------------控制变量-----------------------//
isCameraEnabled=false;
//-------------------------视频--------------------------//
int i = capInitCamera();
dwSize = 320 * 240 * 3;
dwJpg = 40960;
lpFrameBuffer = (LPBYTE) malloc (dwSize);
lpJpgBuffer = (LPBYTE) malloc (dwJpg);
if(i《=0)
{
//::MessageBox(NULL, L“Init camera error ”, L“Notice”, 0);
goto video_error;//出错,释放空间
}