多媒体网络通信技术大作业.doc_第1页
多媒体网络通信技术大作业.doc_第2页
多媒体网络通信技术大作业.doc_第3页
多媒体网络通信技术大作业.doc_第4页
多媒体网络通信技术大作业.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.多媒体网络通信技术大作业电信1203朱银啸01212093103091、题目:基于局域网的可视对讲系统设计2、系统开发环境与工具:(1)、硬件环境:实验室局域网(2)、软件环境:WindowsXP操作系统(3)、开发工具:自己熟悉的面向对象的网络通信编程工具与平台,相关音频、视频编码与传输协议类库3、要求与评分标准:(1)要求:在以上硬软件环境下,利用合适的开发工具,设计一套可视对讲软件,实现局域网内两台计算机之间的可视对讲功能,要求音视频信号连续性、实时性较好,满足正常交流需要。(2)评分标准系统原理分析(20分)1.系统原理概述(10分)2.关键技术分析(10分)系统总体方案设计(30分)1.按模块化设计要求画系统结构图(15分)2数据流分析(15分)系统具体设计(30分)呼叫处理模块流程图与关键代码(6分)音视频采集与播放模块流程图与关键代码(6分)音视频处理(编解码)模块流程图与关键代码(6分)音视频封包与解析模块流程图与关键代码(6分)音视频发送与接收模块流程图与关键代码(6分)系统测试与评价(20)实现语音通信(6分)实现视频通信(6分)实现音视频同步(8分)代码客户端请求连接线程(呼叫处理)关键代码如下:DWORD WINAPI ConnectThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;ASSERT(pChatRoom ! = NULL);pChatRoom -m_ConnectSock = socket (AF_INET ,SOCK_STREAM , IPPROTO_TCP);if ( pChatRoom-m_ConnectSock = INVALID_SOCKET) AfxMessageBox(_T(新建Socket 失败! );return FALSE;CString strServIp;pChatRoom-GetDlgItemText(IDC_IP_ADDR, strServIp);int iPort = pChatRoom -GetDlgItemInt (IDC_CONNECT_PORT);if( iPort 65535 ) AfxMessageBox(_T(请输入合适的端口:1 - 65535);goto _Error_End;char szIpAddr16 = 0;USES_CONVERSION;strcpy_s(szIpAddr, 16, T2A(strServIp);sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(iPort);server.sin_addr.s_addr = inet_addr(szIpAddr);if(connect(pChatRoom-m_ConnectSock,(struct sockaddr*)&server, sizeof(struct sockaddr) = SOCKET_ERROR )AfxMessageBox(_T(连接失败,请重试! );goto _Error_End;pChatRoom-ShowMsg(_T( 系统信息: 连接服务器成功! );while( TRUE ) if ( SOCKET_Select(pChatRoom-m_ConnectSock) ) TCHAR szBufMAX_BUF_SIZE = 0;int iRet = recv (pChatRoom-m_ConnectSock, (char*)szBuf, MAX_BUF_SIZE, 0);if ( iRet 0 ) pChatRoom-ShowMsg(szBuf);elsepChatRoom-ShowMsg(_T(聊天服务器已停止,请重新进行连接! );break;Sleep(500);_Error_End:closesocket(pChatRoom-m_ConnectSock);return TRUE;/捕获窗口BOOL VideoCapture:Initialize() char devname128=0,devversion128=0; int index=0; BOOL ret = TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE; TRACE(VideoCapture:Initializen); /创建一个AVICap捕获窗口 m_capwnd = capCreateCaptureWindow(Capture,WS_POPUP,0,0,1,1,0,0);if(!m_capwnd)return FALSE;/connect callback functionsret = capSetUserData(m_capwnd,this);/Change destroy functions also. ret1 = capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); /得到已安装的捕获设备的名称及版本 ret2 = capGetDriverDescription(index,devname,100,devversion,100);/ Connect to webcam driver/使一个捕获窗口与一个捕获设备连接或关联ret3 = capDriverConnect(m_capwnd,index);if(!(ret & ret1 & ret2 & ret3)/ Device may be open already or it may not have been/ closed properly last time.AfxMessageBox(Unable to open Video Capture Device);/log.WriteString(n Unable to connect driver to the window);m_capwnd=NULL;return FALSE;/ Set the capture parametersif(SetCapturePara()=FALSE)/ log.WriteString(n Setting capture parameters failed);capDriverDisconnect(m_capwnd); /使捕获窗口与一个捕获设备断开return FALSE;return TRUE;下面程序为设置CAPTUREPARAMS结构的实现代码:BOOL VideoCapture:SetCapturePara()CAPTUREPARMS CapParms=0;capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms);/得到当前的捕获速度CapParms.fAbortLeftMouse = FALSE;CapParms.fAbortRightMouse = FALSE;CapParms.fYield = TRUE;CapParms.fCaptureAudio = FALSE;CapParms.wPercentDropForError = 80;if(!capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms)/ log.WriteString(n Failed to set the capture parameters );return FALSE;/ Set Video Format capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);/log.WriteString(n Video parameters set properly);return ret;/终止一个捕获任务BOOL VideoCapture:StopCapture()capCaptureStop(m_capwnd);capCaptureAbort(m_capwnd);Sleep(500);return TRUE;音视频编码处理就是对音视频进行压缩。MPEG-4编码算法的完整源代码如下:class CVideoEncoderX264 :public:CVideoEncoderX264(void);CVideoEncoderX264(void);virtual bool Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item);virtual void Release(void);virtual void Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame);private: x264_picture_t m_Pic;x264_t *h; x264_param_t param; void Flush(void);文件:VideoEncoderX264.cppbool CVideoEncoderX264:Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item)CBase:Connect(pNotify, Item);ParseSize(Item.m_stSize);x264_param_default( ¶m );param.i_threads = 1;param.i_frame_total = 0;param.i_width = m_nWidth;param.i_height = m_nHeight;param.i_keyint_min = Item.m_nKeyInterval;param.i_keyint_max = Item.m_nKeyInterval * 10;param.i_fps_num = Item.m_nFps;*/param.i_log_level = X264_LOG_NONE;if( ( h = x264_encoder_open( ¶m ) ) = NULL ) return false; /* Create a new pic */x264_picture_alloc( &m_Pic, X264_CSP_I420, param.i_width, param.i_height );return true;void CVideoEncoderX264:Release(void)Flush();x264_picture_clean( &m_Pic );x264_encoder_close( h );CBase:Release();void CVideoEncoderX264:Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame)if(nLen != param.i_width * param.i_height * 3)return;param.i_frame_total +;memcpy(m_Pic.img.plane0, pInData, param.i_width * param.i_height);memcpy(m_Pic.img.plane1, pInData + param.i_width * param.i_height, param.i_width * param.i_height / 4);memcpy(m_Pic.img.plane2, pInData + param.i_width * param.i_height * 5 / 4, param.i_width * param.i_height / 4);m_Pic.i_pts = (int64_t)param.i_frame_total * param.i_fps_den;static x264_picture_t pic_out;x264_nal_t *nal = NULL;int i_nal, i;if( &m_Pic )m_Pic.i_type = X264_TYPE_AUTO;m_Pic.i_qpplus1 = 0;/TraceTime(x264_encoder_encode begin);if( x264_encoder_encode( h, &nal, &i_nal, &m_Pic, &pic_out ) 0 ) return;/TraceTime(x264_encoder_encode end);int nOutCanUse = nOutLen;nOutLen = 0;for( i = 0; i 0 )nOutLen += i_size;nOutCanUse -= i_size;nKeyFrame = pic_out.i_type=X264_TYPE_IDR;/ | (pic_out.i_type=X264_TYPE_I & coCfg-x264_max_ref_frames=1)void CVideoEncoderX264:Flush(void)x264_picture_t pic_out;x264_nal_t *nal;int i_nal, i;int i_file = 0;if( x264_encoder_encode( h, &nal, &i_nal, NULL, &pic_out ) 0 )不妨假设创建的线程名为sendThread,发送代码如下:while(1)isOK=true; /准备就绪SuspendThread(sendThread); /挂起线程isOK=false; /线程正在发送数据int length=frameLength; /待发数据长度if(length0) n=send(sock,(char*)imageBuf+sendCount,length,0); /发送数据,/imageBuf是指针,指向待发数据帧if(n=SOCKET_ERROR) /网络出现异常,则退出线程break;length-=n;sendCount+=n;接收端创建一个线程专门用来执行数据接收。不妨假设线程名为recThread,核心代码实现如下:while(temp!=SOCKET_ERROR)if(!isStart) /帧数据是否开始,true表示开始if(endNum3) /endNum纪录当前接收未处理的数据endNum=0;temp=recv(clisock,(char*)(recBuf+endNum),1000,0);/从缓冲区读取数据startPos=serchStr(temp+endNum); /查找帧开始标志if(startPo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论