流媒体网欢迎您!
全世界的网络联合起来,流媒体世界一定能实现!
 
   
IPTV | P2P流媒体 | 移动流媒体 | 数字家庭 | 流媒体宽频 | 网络流媒体 | 安防监控 | 视频会议 | VIP会员 | 行业专题 | 业内专访
 
 
 
您现在的位置: 流媒体网 >> 安防监控 >> 解决方案 >> 监控正文
 
基于IOCP的MPEG-4出租车无线视频监控系统设计与实现
作者:佚名  来源:电子产品世界  发布时间:2008-4-18 11:34:07

    网络传输数据包通过自加包头进行解析,通过不同通道传送视频数据/控制命令。加载过程如图3。

    服务器的网络传输部分的实现

    服务器通过UI线程和Worker线程池(Threads Poo1)来确保服务器对多个客户端的并发控制和通讯。服务器通讯功能主要实现简述如下:

    1.启动监听线程并初始化完成端口(IOCP)核心对象,进入对CDMA终端喝监控终端的监听状态,主要通过CreateIoCompletionPort函数实现,此函数主要实现两个功能1)建立IOCP对象,2)将接受到的套接字(SOCKET)同IOCP关联。

 

  HANDLE CreateIoCompletionPort(
      HANDLE FileHandle,//功能1时为INVALID_HANDLE_VALUE,功能2时为接受的SOCKET
  HANDLE ExistingCompletionPort,,//功能1时赋值NULL,功能2时输入已建立的IOCP对象
  ULONG_PTR CompletionKey,//完成键自设的数据结构,功能1时为NULL,功能2时完成键
  DWORD  NumberOfConcurrentThreads ) //同时可操作IOCP对象的线程数,设为CPU数×2+2

    2.调用异步接收函数WSARecv()发起接收      SAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine);

    3.查看完成端口的通讯队列,异步接收出租车终端发送的数据和通讯命令,通过调用     GetQueuedCompletionStatus( )函数实现,

  BOOL GetQueuedCompletionStatus(
  HANDLE CompletionPort,//查看的完成端口对象
  LPDWORD lpNumberOfBytes,,// 期望读入的字节数
  PULONG_PTR lpCompletionKey,// 完成键,自设的数据结构
  LPOVERLAPPED* lpOverlapped,// 重叠IO标志,每次查询时需事先清零复位
  DWORD dwMilliseconds) // 设置查询超时时间

    4.自设完成键数据结构如下,包含

  struct CMD_CDMA_LINK_INFO
  {   SOCKET m_hSocket;             // 通讯套接字SOCKET 
      UINT m_uiCDMAId;             //无符号整型变量保存出租车终端ID
       CString m_strCDMAIP;         //字符串变量保存出租车终端IP地址
       bool  m_bCmdCDMALinkState;   //布尔型变量保存连接状态
       int   m_nNumberOfPendlingIO; //整型变量保存挂起I/O数
       bool  m_bAlarm;    //布尔型变量保存报警标志   
      CCriticalSection m_cmdCDMALinkInfoLock; };//临界区变量,作线程同步

    客户端的解压实现

    客户端也采用多个线程并行处理的模式,分别负责数据通讯、数据处理、解压显示和地图刷新,MPEG-4的解码主要采用XviD解压库。MPEG-4协议有非对称性的特点,即压缩运算量大,复杂性高,为保证视频信息的实时性,视频采集压缩由硬件完成;而解压运算量较小,可以借鉴XviD编解码技术来实现。如前所述,XviD编解码技术有很多突出的优点。在解码过程中解压主函数实现如下
    int CDecThread::dec_main(BYTE* istream, BYTE* ostream,int istream_size,
    xvid_dec_stats_t * xvid_dec_stats)
    {int ret=XviD_ERR_FAIL; //默认值-1
    /* Reset all structures */
    memset(&xvid_dec_frame, 0, sizeof(xvid_dec_frame_t)); 
     memset(xvid_dec_stats, 0, sizeof(xvid_dec_stats_t));         //初始化所有数据结构
     /* Set version设置解压版本*/
     xvid_dec_frame.version = XviD_VERSION; 
     xvid_dec_stats->version = XviD_VERSION;
     /* No general flags to set //设置主标志位*/
     xvid_dec_frame.general          = 0;
     /* Input stream输入解压数据流*/
     xvid_dec_frame.bitstream        = istream; 
     xvid_dec_frame.length           = istream_size;
     /* Output frame structure输出帧结构 */
     xvid_dec_frame.output.plane[0]  = ostream;
     xvid_dec_frame.output.stride[0] = m_nXDIM*m_nBPP;
     xvid_dec_frame.output.csp = m_nCSP;
     ret = xvid_decore(dec_handle, XviD_DEC_DECODE, &xvid_dec_frame, xvid_dec_stats);
     return(ret);
    }

    结语

    本文从MPEG-4数字视频监控的定制系统出发,通过研究,提出了一般的实现方法。通过模块化设计并使用COM封装,使系统主体做到与前端硬件的低耦合度,易于维护 使用完成端口技术传输视频,同时,客户端软件使用Xvid实现了解压。本文所沦述的方法已经在实际工程中得到应用,取得了良好的效果。

上一页  [1] [2] [3] 

责任编辑:leilei123_hb  收藏此页到365Key   
  • 上一篇监控:
  • 下一篇监控:
  •  
    相关新闻
    视频监控调度系统在石化行业生产管理中的应用
    evergreen出超低价MPEG-4 摄像机
    Axis推出世界上最小的MPEG-4网络摄像机