VC++ 音视频 编解码 技术及实践 视频通信, 疑问求解
VisualC++ 音视频 编解码 技术及实践 求是科技编写的。
第十章,视频通信例的例子。
接收端看到的,是乱糟糟糕的东西。
有谁运行成功看到东西么?
//1.初始化卡 void CServerPlusDlg::InitVideoCard(){ //创建视频捕获窗口 this->m_hWndCapture=::capCreateCaptureWindow("Capture Window", WS_VISIBLE|WS_CHILD,0,0,320,240,this->m_hWnd,1); //关联到第1个采集设备 capDriverConnect(this->m_hWndCapture,0); //设置视频格式 capSetVideoFormat(this->m_hWndCapture, &this->m_InInfo,sizeof(BITMAPINFO)); //设置预览模式(preview mode)的显示速率 capPreviewRate(this->m_hWndCapture,40); //设置预览模式 capPreview(this->m_hWndCapture,TRUE); //设置帧采集回调函数 capSetCallbackOnFrame(this->m_hWndCapture,FrameCallBack);} return TRUE; }//---------------------//帧采集回调函数//采集到一帧数据时就调用该函数LRESULT CALLBACK CServerPlusDlg::FrameCallBack(HWND hWnd, LPVIDEOHDR lpVHdr){ CServerPlusDlg* pDlg=(CServerPlusDlg*)::AfxGetMainWnd(); //处于连接状态 if (pDlg->m_bConnect==TRUE) { //编码并发送 pDlg->CompressFrame(lpVHdr); } //返回 return TRUE;}//编码压缩并发送void CServerPlusDlg::CompressFrame(LPVIDEOHDR lpVHdr){ //是否为关键帧 BOOL bKeyFrame; //视频帧实际大小 m_OutActSize=this->m_InInfo.bmiHeader.biSizeImage; //编码压缩 BYTE* Buf=(BYTE*)ICSeqCompressFrame(&m_CV,0, lpVHdr->lpData,&bKeyFrame,(long*)&m_OutActSize); //处于连接状态,并且视频数据大小合适 if (this->m_bConnect==TRUE && m_OutActSize<8180) { //视频数据 VIDEO_DATA VideoData; //初始化 memset(&VideoData,0,sizeof(VIDEO_DATA)); //标记是否为关键帧 VideoData.bKeyFrame=bKeyFrame; //复制视频(裸)数据 memcpy(VideoData.Buf,Buf,m_OutActSize); //复制视频帧序号 VideoData.nSampleNum=this->m_SampleNum; //编码器输出实际大小 VideoData.nUsedSize=m_OutActSize; //发送完整的视频帧数据 this->m_ServerStreamSock.Send(&VideoData,sizeof(VIDEO_DATA)); //更新视频帧序号 m_SampleNum+=1; }}//视频数据typedef struct _VIDEO_DATA{ //是否关键帧 BOOL bKeyFrame; //视频帧序号 DWORD nSampleNum; //视频帧实际大小 DWORD nUsedSize; //缓存 BYTE Buf[8180];}VIDEO_DATA;