HardBirch

基于wince的网络音视频通信(简单易明版)

时间:08-11-30 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:41 点击: 12,497 次

 



由于这个学期的期末将至,因此期末大作业也要开始做了。这次做的是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部分的代码

  1. #pragma once
  2. #include "winsock2.h"
  3. //RTP支持
  4. #include "../UDP/UDP.h"
  5. //音频支持
  6. #include "WaveIn.h"
  7. #include "WaveOut.h"
  8. //G726支持
  9. #include "g726.h"
  10. //摄像头支持
  11. #include "./video//zc030xlib.h"
  12. #define Video_Width 320 //视频宽度
  13. #define Video_Height 240 //视频长度
  14. #define AudioData_Size 960  //每块音频数据包的大小
  15. #define Compr_AudioData_Size 120  //压缩后音频块的大小
  16. //音频输入输出变量
  17. CWaveIn *g_pIn;
  18. CWaveOut *g_pOut;   
  19. char pin[AudioData_Size],pout[Compr_AudioData_Size];
  20. char waveout[AudioData_Size];
  21. //摄像头输入变量
  22. DWORD dwSize;
  23. DWORD dwJpg;
  24. DWORD dwRtnSize[2];/* 0 - for bmp, 1 - for jpeg */
  25. LPBYTE lpFrameBuffer;
  26. LPBYTE lpJpgBuffer ;
  27. //控制变量
  28. bool isCameraEnabled;
  29. //UDP
  30. CUDP_CE m_CEUdp;
  31. class AVClass
  32. {
  33. public:
  34.     //=====================================================================
  35.     //  语法格式:   void InitAV(CWnd * p)
  36.     //  实现功能:   初始化音频和视频,用于录音、播放音频,以及播放视频
  37.     //  参数:     p为窗口类指针
  38.     //  返回值:    无
  39.     //=====================================================================
  40.     void InitAV(CWnd * p,int local_port,CString remote_ip,int remote_port)
  41.     {
  42.        //-----------------------初始化UDP-----------------------//
  43.        m_CEUdp.m_OnUdpRecv = OnUdpCERecv;
  44.        DWORD nResult = m_CEUdp.Open(p,local_port,remote_ip,remote_port);
  45.        if (nResult <=0) 
  46.        {
  47.            AfxMessageBox(_T("打开端口失败"));
  48.            return;
  49.        }
  50.         //------------------------控制变量-----------------------//
  51.         isCameraEnabled=false;
  52.         //-------------------------视频--------------------------//
  53.         int i = capInitCamera();
  54.         dwSize = 320 * 240 * 3;
  55.         dwJpg = 40960;
  56.         lpFrameBuffer = (LPBYTE) malloc (dwSize);   
  57.         lpJpgBuffer = (LPBYTE) malloc (dwJpg);
  58.         if(i<=0)
  59.         {
  60.             //::MessageBox(NULL, L"Init camera error ", L"Notice", 0);
  61.             goto video_error;//出错,释放空间
  62.         }
  63.         if (0 != capSetVideoFormat(0, VIDEO_PALETTE_RGB24, VIDEO_SIZE_SIF))
  64.         {
  65.             //::MessageBox(NULL, L"SetVideoFormat error ", L"Notice", 0);
  66.             goto video_error;//出错,释放空间
  67.         }
  68.         if (capStartCamera(0) != 0) 
  69.         {
  70.             //::MessageBox(NULL, L"StartCamera error ", L"Notice", 0);
  71.             capStopCamera(0);
  72.             goto video_error;//出错,释放空间
  73.         }
  74.         //没出错,进行视频(控制状态)、音频设置
  75.         isCameraEnabled=true;
  76.         goto audio;
  77. video_error:    
  78.         free (lpFrameBuffer);
  79.         lpFrameBuffer = NULL;
  80.         free (lpJpgBuffer);
  81.         lpJpgBuffer = NULL;
  82.         //-------------------------音频--------------------------//
  83. audio:  
  84.         g_pOut = new CWaveOut();
  85.         g_pIn = new CWaveIn();
  86.         g_pOut->StartPlay();
  87.         g_pIn->StartRec(OnRecCapAndSend,(DWORD)p);
  88.         
  89.     }
  90.     //=====================================================================
  91.     //  语法格式:   void FreeAV()
  92.     //  实现功能:   释放音频、视频
  93.     //  参数:     无
  94.     //  返回值:    无
  95.     //=====================================================================
  96.     void FreeAV()
  97.     {
  98.         //-------------------------视频--------------------------//
  99.         if(isCameraEnabled)
  100.             capStopCamera(0);
  101.         //-------------------------音频--------------------------//
  102.         g_pOut->StopPlay();
  103.         g_pIn->StopRec();
  104.         delete g_pOut;
  105.         delete g_pIn;
  106.         //------------------------UDP------------------------//
  107.         m_CEUdp.Close();
  108.     }
  109.     //=====================================================================
  110.     //  语法格式:   void RecAndPlay(WPARAM wParam,LPARAM lParam)
  111.     //  实现功能:   接收网络传来的音频,以及播放
  112.     //  参数:     wParam,表示数据;lParam,表示数据长度
  113.     //  返回值:    无
  114.     //=====================================================================
  115.     static void CALLBACK OnUdpCERecv(CWnd * pWnd,char* buf,int nLen,sockaddr * addr)
  116.     {
  117.         g726_Decode(buf,(unsigned char*)waveout);
  118.         
  119.         g_pOut->Play(waveout,AudioData_Size);
  120.     }
  121.     //=====================================================================
  122.     //  语法格式:   static void OnRecCapAndSend(char *data,int length,DWORD userdata)
  123.     //  实现功能:   录音,摄像并且发送
  124.     //  参数:     data表示数据,length表示数据长度,userdata暂时没用
  125.     //  返回值:    无
  126.     //=====================================f================================
  127.     static void OnRecCapAndSend(char *data,int length,DWORD userdata)
  128.     {
  129.         //-------------------------音频--------------------------//
  130.         memcpy(pin,g_pIn->buffer,AudioData_Size);   
  131.         g726_Encode((unsigned char*)pin,pout);
  132.         m_CEUdp.SendData(pout,Compr_AudioData_Size);
  133.         //-------------------------视频--------------------------//
  134.         if(isCameraEnabled==false)//如果程序不能用摄像头
  135.             return;
  136.         Sleep(15);
  137.         int index=0;
  138.         memset(lpFrameBuffer, 0, dwSize);
  139.         memset(lpJpgBuffer, 0, dwJpg);
  140.         dwRtnSize[0] = dwRtnSize[1] = 0;
  141.         if (capGetPicture(index, lpFrameBuffer, dwSize, lpJpgBuffer, dwJpg, dwRtnSize) == 0)
  142.         {
  143.             /// m_CEUdp.SendData((const char *)lpJpgBuffer,dwRtnSize[1]);
  144.             char tmp[1440];
  145.             int tmp_i=0;
  146.             for(int i=0;i<dwRtnSize[1];i++)
  147.             {
  148.                 tmp[tmp_i]=lpJpgBuffer[i];
  149.                 tmp_i++;
  150.                 if(tmp_i==1440)
  151.                 {
  152.                     m_CEUdp.SendData(tmp,1440);
  153.                     tmp_i=0;
  154.                     
  155.                 }
  156.                 else if(i==dwRtnSize[1]-1)
  157.                 {
  158.     m_CEUdp.SendData(tmp,dwRtnSize[1]-(dwRtnSize[1]/1440)*1440);
  159.                     tmp_i=0;
  160.                 }
  161.             }
  162.         }
  163.     }
  164. };

以下是PC部分的关键代码

  1. #pragma once
  2. #include "winsock2.h"
  3. //UDP支持
  4. #include "../UDP/UDP.h"
  5. //音频支持
  6. #include "WaveIn.h"
  7. #include "waveout.h"
  8. //G726支持
  9. #include "g726.h"
  10. //视频支持
  11. #include "Gdiplus.h"
  12. using namespace Gdiplus; 
  13. #define VideoData_Size 1440 //每块视频数据包的大小
  14. #define Video_Width 320 //视频宽度
  15. #define Video_Height 240 //视频长度
  16. #define AudioData_Size 960  //每块音频数据包的大小
  17. #define Compr_AudioData_Size 120  //压缩后音频块的大小
  18. //音频输入输出变量
  19. CWaveIn *g_pIn;
  20. CWaveOut *g_pOut;   
  21. char pin[AudioData_Size],pout[Compr_AudioData_Size];
  22. char wave_data[AudioData_Size];
  23. //UDP变量
  24. CUDP_CE m_CEUdp;
  25. //视频输入变量
  26. GdiplusStartupInput m_gdiPlusInPut;
  27. ULONG_PTR m_gdiPlusToken;
  28. char video_data[Video_Width*Video_Height];
  29. int index;//视频数据当前索引
  30. class AVClass
  31. {
  32. private:
  33.     
  34. public:
  35.   //=====================================================================
  36.     //  语法格式:   void InitAV(CWnd * p)
  37.     //  实现功能:   初始化音频和视频,用于录音、播放音频,以及播放视频
  38.     //  参数:     p为窗口类指针
  39.     //  返回值:    无
  40.     //=====================================================================
  41.     void InitAV(CWnd * p,int local_port,CString remote_ip,int remote_port)
  42.     {
  43.         //-------------------------UDP连接--------------------------//
  44.         m_CEUdp.m_OnUdpRecv = OnUdpCERecv;
  45.         DWORD nResult = m_CEUdp.Open(p,local_port,remote_ip,remote_port);
  46.         if (nResult <=0) 
  47.         {
  48.             AfxMessageBox(_T("打开端口失败"));
  49.             return;
  50.         }
  51.         //-------------------------音频--------------------------//
  52.         g_pOut = new CWaveOut();
  53.         g_pIn = new CWaveIn();
  54.         g_pOut->StartPlay();
  55.         g_pIn->StartRec(OnRecording,(DWORD)p);  
  56.         //-------------------------视频--------------------------//
  57.         GdiplusStartup( &m_gdiPlusToken, &m_gdiPlusInPut, NULL ); //初始化GDI+ 
  58.         memset(video_data,0,Video_Width*Video_Height);
  59.         index=0;
  60.     }
  61.     //=====================================================================
  62.     //  语法格式:   void FreeAV()
  63.     //  实现功能:   释放音频、视频
  64.     //  参数:     无
  65.     //  返回值:    无
  66.     //=====================================================================
  67.     void FreeAV()
  68.     {
  69.         
  70.         //-------------------------音频--------------------------//
  71.         g_pOut->StopPlay();
  72.         g_pIn->StopRec();
  73.         delete g_pOut;
  74.         delete g_pIn;
  75.         //-------------------------视频--------------------------//       
  76.         GdiplusShutdown(m_gdiPlusToken); //销毁GDI+
  77.         //------------------------UDP--------------------------//
  78.         m_CEUdp.Close();
  79.     }
  80.     //=====================================================================
  81.     //  语法格式:   void RecAndPlay(WPARAM wParam,LPARAM lParam,HWND hwnd)
  82.     //  实现功能:   接收网络传来的音频,以及播放
  83.     //  参数:     wParam,表示数据;lParam,表示数据长度;hwnd,表示显示视频的窗口句柄
  84.     //  返回值:    无
  85.     //=====================================================================
  86.      static void CALLBACK OnUdpCERecv(CWnd *pWnd,char* buf,int nLen,sockaddr * addr)
  87.      {
  88.         /*测试收到的数据大小
  89.         
  90.         CString tmp;
  91.         tmp.Format(L"%d",nLen);
  92.         MessageBox(0,tmp,0,0);
  93.         return;*/
  94.         //-------------------------如果是音频数据--------------------------//
  95.         if(nLen==Compr_AudioData_Size)
  96.         {
  97.             g726_Decode(buf,(unsigned char*)wave_data);
  98.             g_pOut->Play(wave_data,AudioData_Size);
  99.             return;
  100.         }
  101.         //-------------------------如果是视频数据--------------------------//
  102.       
  103.         if(nLen==VideoData_Size)//完整的视频数据块
  104.         {
  105.             for(int i=0;i<nLen;i++)
  106.             {
  107.                 video_data[index]=buf[i];
  108.                 index++;
  109.             }
  110.             return;
  111.         }
  112.         //视频数据块的最后一块
  113.         for(int i=0;i<nLen;i++)
  114.         {
  115.             video_data[index]=buf[i];
  116.             index++;
  117.         }
  118.         //如果JPEG图像特别大,则肯定是出错,则抛弃
  119.         if(index>Video_Width*Video_Height)
  120.         {
  121.             //MessageBox(0,"缓冲区出错","错误信息",0);
  122.             return;
  123.         }
  124.         
  125.     
  126.         try{
  127.             IPicture *pPic;
  128.             IStream *pStm ; 
  129.             //分配全局存储空间 
  130.             HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,index);
  131.             LPVOID pvData=NULL ;
  132.             //锁定分配内存块 
  133.             pvData=GlobalLock(hGlobal);
  134.             //复制数据包video_data到pvData
  135.             memcpy(pvData,video_data,index);
  136.             GlobalUnlock(hGlobal);
  137.             CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
  138.             ULARGE_INTEGER        pSeek;       
  139.             LARGE_INTEGER    dlibMove  ={  0  }  ;  
  140.             pStm->Seek(dlibMove,STREAM_SEEK_SET  ,&pSeek);  
  141.         //  Sleep(15);
  142.             //装入图形文件
  143.             if(FAILED(OleLoadPicture(pStm,index,TRUE,IID_IPicture,(LPVOID*)&pPic)))
  144.             {//附:如果video_data这个数组包含的图像有错,则OleLoadPicture 容易产生读写内存错误
  145.             //  pPic->Release();
  146.             //  pStm->Release();
  147.                 return ;
  148.             }
  149.             Image img(pStm,0);
  150.             Graphics mGraphics(GetDC(pWnd->m_hWnd));
  151.             mGraphics.DrawImage(&img, 0, 0, Video_Width, Video_Height);
  152.             img.~Image();//会出错
  153.             mGraphics.~Graphics();
  154.             pPic->Release();
  155.             pStm->Release();
  156.         }
  157.         catch(CException * e)
  158.         {}
  159.         memset(video_data,0,Video_Width*Video_Height);
  160.         index=0;
  161.      }
  162.     //=====================================================================
  163.     //  语法格式:   static void OnRecording(char *data,int length,DWORD userdata)
  164.     //  实现功能:   释放音频
  165.     //  参数:     data表示数据,length表示数据长度,userdata暂时没用
  166.     //  返回值:    无
  167.     //=====================================================================
  168.     static void OnRecording(char *data,int length,DWORD userdata)
  169.     {
  170.         memcpy(pin,g_pIn->buffer,AudioData_Size);   
  171.         g726_Encode((unsigned char*)pin,pout);
  172.         m_CEUdp.SendData(pout,Compr_AudioData_Size);
  173.     }
  174. };

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: 基于wince的网络音视频通信(简单易明版)

基于wince的网络音视频通信(简单易明版):目前有41 条留言

  1. 41楼
    xumercury:

    很好很强大。我的考虑是。有机会整个WIFI的模块。用无线的来弄。我一直在准备一个智能家居的构想。GV你这个东东可以做BB房的监控。很好。

    2008-11-30 12:25 [回复]
  2. 40楼
    winzheng:

    THANKS

    2009-01-13 09:20 [回复]
  3. 39楼
    yzbsd:

    音频和视频轮流发送,音频接受后播放时卡的太厉害,有没有更好的方式?

    2009-04-30 10:59 [回复]
  4. 38楼
    hellogv:

    换个音频编码,或许会好些。。。。。

    2009-05-01 13:41 [回复]
  5. 37楼
    lanmanck:

    不好用吧?友善之臂的录音驱动有问题,我都问过了。自带的都录不了音,楼主如何录?

    2009-05-25 08:52 [回复]
  6. 36楼
    hellogv:

    QQ2440可以,MINI2440不行

    2009-05-25 09:24 [回复]
  7. 35楼
    larryk:

    我将ppc2003的平台换成我的平台yl2440,但弄了很久都没成功。麻烦博主看一看我的提问并给予指导:
    http://topic.csdn.net/u/20090527/16/6c352890-4172-485b-a906-589ce3df9388.html
    谢谢

    2009-05-28 20:46 [回复]
  8. 34楼
    larryk:

    我把库加上后,现在貌似没错误了,在开发板上再试试。有问题再请教hellogv兄了。

    2009-05-29 10:12 [回复]
  9. 33楼
    larryk:

    hellogv兄,又来麻烦你了。
    我新建了一个工程,选智能设备的MFC应用,平台是我导进去的ly2440,把你原来项目里的文件转移到我的项目里,工程属性里选择使用MFC静态库。结果build的时候出现300多个错误。大多是在uafxcwd.lib这个文件上的,错误如下:unresolved external symbol _CrtDbgReportW,和unresolved external symbol __CxxFrameHandler3,什么问题?

    本人提问的网页:http://topic.csdn.net/u/20090531/19/8f237190-2859-4061-9245-4b249e6f3f45.html
    非常需要并感谢的你指导

    2009-05-31 19:21 [回复]
  10. 32楼
    larryk:

    我修修改改,程序终于能运行,开发板能接到pc端的声音了,但pc端收不到开发板发出的声音。查了很久没查出什么原因???

    2009-06-01 16:30 [回复]
  11. 31楼
    larryk:

    好了,后来查出来是硬件问题。非常感谢

    2009-06-02 15:21 [回复]
  12. 30楼
    l840828:

    hellogv大大 我在移植你的这个程序 2440的板子wince5.0 现在还剩一个error C3861: 'AfxSocketInit': identifier not found 这个函数需要定义吗

    2009-11-18 20:18 [回复]
  13. 29楼
    l840828:

    在RTP_CE.cpp中
    if (!AfxSocketInit())
    {
    AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    return FALSE;
    }

    2009-11-18 20:19 [回复]
  14. 28楼
    hellogv:

    请确保使用VS2005编译。

    2009-11-18 20:42 [回复]
  15. 27楼
    l840828:

    谢谢hellogv大大的及时回复 原来是新建工程时没有选上windows sockets。现在程序debug后没错误了也下进开发板了,不过我的摄像头是OV9650,手上有驱动程序和测试程序,该怎么移植呢? 能不能指导一下 说说思路 谢谢啊

    2009-11-19 16:10 [回复]
  16. 26楼
    hellogv:

    1.把摄像头数据取出
    2.把数据转换成JPEG等
    3.把图像转换成二进制发送到PC

    具体看你的OV9650提供了什么功能,但传输之前一定要编码压缩。

    2009-11-19 17:16 [回复]
  17. 25楼
    l840828:

    hellogv大大 我现在已经把摄像头数据取出了 也能抓一帧保存成bmp 怎么把保存的图片转换成二进制呢 能不能先不编解码 现在想着先把他打通 数据丢失无所谓 能传输就行

    2009-11-19 20:20 [回复]
  18. 24楼
    hellogv:

    把摄像头的数据取出,直接发到PC,再在PC上保存为BMP显示。。。。。。至于编不编码,随你便

    2009-11-19 21:30 [回复]
  19. 23楼
    l840828:

    在PC上能不能直接使用你这个工程中的PC_RTP应用程序,我在EVC上编一个wince的应用程序下到板子上,也使用UDP协议的话?

    2009-11-20 08:37 [回复]
  20. 22楼
    hellogv:

    不能直接使用,还必须经过修改。我写的PC端不是万能的。

    2009-11-20 08:53 [回复]
  21. 21楼
    glasseating:

    gv兄,我移植了你的RTP(最基本),基于WINCE的G726语音通话实现 到我的2440开发板上,都没问题,但移植网络音视频通信时,在VS2005上DEBUG没问题,但是开发板弹出对话框说 debug assertion failed ,file:winocc.cpp line:245。winocc245行是SetWindowText函数,gv兄帮下忙,谢谢!

    2009-12-23 09:00 [回复]
  22. 20楼
    hellogv:

    这个问题,我在做的时候没有遇到,你试试不用Debug,直接把程序运行在板上

    2009-12-23 09:08 [回复]
  23. 19楼
    glasseating:

    谢谢gv兄
    是不是start without debugging?试了这个还是那样。我发现remoote ip和local ip可以显示出来,但是remote port和local port没有显示出来,是不是这个问题呢?我看程序,端口为IP尾段的平方,也应该显示啊

    2009-12-23 09:56 [回复]
  24. 18楼
    glasseating:

    晕 果然是端口的问题 我把端口的ID定义错了 谢谢gv兄把自己的程序共享出来 再次感谢

    2009-12-23 10:05 [回复]
  25. 17楼
    glasseating:

    gv兄,我的摄像头是提供的API函数是:获得预览模式下最新1帧RGB图像的内存地址, 然后我把内存地址中的数据取出来,存放在开辟好的lpJpgBuffer空间中, memcpy(lpJpgBuffer,(const char *)image.rgb_address,Video_Width*Video_Height*2); 再用gv兄的分割发送,我在PC端测试收到的数据大小是VideoData_Size=1440,但是没有图像,我的思路是不是有问题呢?
    还有是不是capGetPicture后dwRtnSize[1]就是Video_Width*Video_Height*2?dwJpg = 40960又是怎么算的呢?
    因为移植了好长时间了,不想放弃,麻烦gv兄了

    2009-12-30 09:54 [回复]
  26. 16楼
    匿名用户:

    gv兄,你的PC端是怎么判断开发板传完一帧图片的,我的PC端能收到1440大小的视频包,但是显示不出来,愁人啊

    2010-01-05 22:48 [回复]
  27. 15楼
    hellogv:

    把图像分块,每块1440大小,然后计数接收,在10M的网卡(ARM9)上都是要这样做的,100M网卡就没这种问题了

    2010-01-06 00:40 [回复]
  28. 14楼
    匿名用户:

    我看出来是分成1440大小的视频包计数接收了,PC也收到了,但是怎么确定一帧图像传送结束,就是显示这块不大明白,gv兄能说下思路吗[e07]

    2010-01-06 08:50 [回复]
  29. 13楼
    hellogv:

    先建一个缓存区,把1440大小的块保存下来,当遇到未满1440大小的块时,也就是最后一块了,把整个缓冲区的数据转换成图像显示。。。。如此类推

    2010-01-06 08:54 [回复]
  30. 12楼
    匿名用户:

    我遇到的问题就是所有的视频包都是1440大小 所以找不到最后一块 怪不得显示不出来

    2010-01-06 09:23 [回复]
  31. 11楼
    apollolasd:

    请问PC端用什么软件编译较好?

    2010-04-26 12:02 [回复]
  32. 10楼
    hellogv:

    回复 apollolasd:
    PC端用VS2005

    2010-04-26 12:48 [回复]
  33. 9楼
    kangseaman:

    我现在用的是扬创2440的wince系统,下载了15分钟中星微摄像头驱动,可是驱动老是加载不成功。能告诉我这种驱动加载的具体方法和过程吗?
    初学,请指导啊。。

    2010-04-28 09:42 [回复]
  34. 请问能否帮忙做个无线传输的,或帮忙指教下谢谢

    2010-05-09 12:15 [回复]
  35. 7楼
    hellogv:

    回复 匿名用户:
    先解决如何使用无线网卡吧

    2010-05-09 12:52 [回复]
  36. 为什么我编译PC端时候出现缺少TCP组件?

    2010-05-10 22:19 [回复]
  37. 5楼
    hellogv:

    回复 匿名用户:
    建议你先从最简单的WIN32 UDP例子学起,这里的部分代码也是来自普通的UDP例子

    2010-05-10 23:47 [回复]
  38. 4楼
    armalism:

    guowei兄,求援啊,我才学ARM和wince没多久,现在想实现“PC通过ARM9(WINCE)远程摄像”的功能,其实就是你在本文所作网络音视频通信中的视频那部分,但我对实现的方法还比较没谱,希望得到你的指点。看了你的CSDN专访,知道肯定会有很多我这样的新手向你求援,对于我们来说的难题在你眼里或许就是一句话,切望gv兄能在百忙之中给予指导和帮助。加你好友了,盼望回应…

    2012-02-17 14:07 [回复]
  39. 地板
    hellogv:

    [reply]armalism[/reply]
    有什么问题,加我msn吧

    2012-02-17 22:04 [回复]
  40. 板凳
    jipengwudi126:

    国威兄,非常感谢你无私提供音视频通信的代码,我用你的程序放在WINCE6.0上 也是使用的中星微301摄像头。我想只用视频采集传输显示不要音频通信。。。可是我把和音频有关的语句都注释掉之后。。。PC端的显示的是空白?视频部分的代码我都没改动啊。。。希望教教我。。。我也是刚开始学习的额。。。不要笑话我。。。

    2012-02-19 14:30 [回复]
  41. 沙发
    hellogv:

    [reply]jipengwudi126[/reply]
    好多年前的代码了…..

    2012-02-19 16:11 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐