首页>
技术资讯>
详情

基于wince的网络音视频通信

2016-05-12 来源:佚名 阅读量: 0
关键词: WINCE

    由于这个学期的期末将至,因此期末大作业也要开始做了。这次做的是N个月前就做过的网络音视频通信,不过这次做了不少改进。

    在这里,先要感谢一下 MacintoshM 大侠,他的帖子给我提供了最原始的源代码,我现在的代码也是在他代码的基础上做出修改的。

    OK,现在进入主题,先来介绍一下这个东东:

    下位机为 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大小的数据包,分别发送了。

    源代码可以到这里下载(2008.12.01才可以下载):

    http://download.csdn.net/user/hellogv

    网络音视频通信

    下面说说关键的源代码:

    以下是WINCE部分的代码

    #pragma once

    #include "winsock2.h"

    //RTP支持

    #include "\UDP\UDP.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 = 409

热门推荐 查看更多