网络传输数据包通过自加包头进行解析,通过不同通道传送视频数据/控制命令。加载过程如图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]