




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多媒体网络通信技术大作业电信1203朱银啸01212093103091、题目:基于局域网的可视对讲系统设计2、系统开发环境与工具:(1)、硬件环境:实验室局域网(2)、软件环境:WindowsXP操作系统(3)、开发工具:自己熟悉的面向对象的网络通信编程工具与平台,相关音频、视频编码与传输协议类库3、要求与评分标准:(1)要求:在以上硬软件环境下,利用合适的开发工具,设计一套可视对讲软件,实现局域网内两台计算机之间的可视对讲功能,要求音视频信号连续性、实时性较好,满足正常交流需要。(2)评分标准系统原理分析(20分)1.系统原理概述(10分)2.关键技术分析(10分)系统总体方案设计(30分)
2、1.按模块化设计要求画系统结构图(15分)2数据流分析(15分)系统具体设计(30分)呼叫处理模块流程图与关键代码(6分)音视频采集与播放模块流程图与关键代码(6分)音视频处理(编解码)模块流程图与关键代码(6分)音视频封包与解析模块流程图与关键代码(6分)音视频发送与接收模块流程图与关键代码(6分)系统测试与评价(20)实现语音通信(6分)实现视频通信(6分)实现音视频同步(8分)代码客户端请求连接线程(呼叫处理)关键代码如下:DWORD WINAPI ConnectThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDl
3、g *)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 iPor
4、t = pChatRoom ->GetDlgItemInt (IDC_CONNECT_PORT);if( iPort <= 0 | 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
5、(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
6、_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(pChatRo
7、om->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,
8、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 driv
9、er/使一个捕获窗口与一个捕获设备连接或关联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 con
10、nect 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:Se
11、tCapturePara()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,&
12、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_c
13、apwnd,&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:
14、;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_
15、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 );
16、;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
17、( ( 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_cl
18、ose( 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);mem
19、cpy(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
20、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_encod
21、e end");int nOutCanUse = nOutLen;nOutLen = 0;for( i = 0; i < i_nal; i+ )int i_size = 0;if( ( i_size = x264_nal_encode( pOutBuf + nOutLen, &nOutCanUse, 1, &nali ) ) > 0 )nOutLen += i_size;nOutCanUse -= i_size;nKeyFrame = pic_out.i_type=X264_TYPE_IDR;/ | (pic_out.i_type=
22、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; /准备就绪SuspendThrea
23、d(sendThread); /挂起线程isOK=false; /线程正在发送数据int length=frameLength; /待发数据长度if(length<50000) /判断数据是否正常int n=0;int sendCount=0;while(length>0) 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(endNum>3) /endNum纪录当前接收未处理的数据endNum=0;temp=recv(clisock,(char*)(recBuf+endNum),1000,0);/从缓冲区读取数据
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人出售房产合同范本
- 加装空调工程合同范本
- 购房合同有购房合同范本
- 单位合伙建房合同范例
- 关于独家合同范本
- 医药会议合同范本
- 单位给买车合同范本
- 化工项目整体承建合同范本
- 产品总经销合同范本
- 医院加盟合同范本
- 2024年四川省公务员考试《行测》真题及答案解析
- 上海市幼儿园幼小衔接活动指导意见(修订稿)
- 投资可行性分析财务数据全套表格
- 公务员2010年国考《申论》真题卷及答案(地市级)
- 2021年6月大学英语四级考试真题及解析(全三套)
- 住院病人跌倒坠床风险评估及防范措施表
- 【道法】认识生命 课件-2024-2025学年统编版道德与法治七年级上册
- 人教版《道德与法治》二年级下册全册课件
- 无人机项目可行性实施报告
- 垃圾清运服务实施方案投标文件(技术方案)
- 2024-2030年中国消费级3D打印机行业市场发展趋势与前景展望战略分析报告
评论
0/150
提交评论