2022年多媒体网络通信技术大作业 .pdf

上传人:Che****ry 文档编号:27195905 上传时间:2022-07-23 格式:PDF 页数:12 大小:76.17KB
返回 下载 相关 举报
2022年多媒体网络通信技术大作业 .pdf_第1页
第1页 / 共12页
2022年多媒体网络通信技术大作业 .pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《2022年多媒体网络通信技术大作业 .pdf》由会员分享,可在线阅读,更多相关《2022年多媒体网络通信技术大作业 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、多媒体网络通信技术大作业电信 1203 朱银啸0121209310309 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 1、题目:基于局域网的可视对讲系统设计2、系统开发环境与工具:(1)、硬件环境:实验室局域网(2)、软件环境: WindowsXP 操作系统(3)、开发工具:自己熟悉的面向对象的网络通信编程工具与平台,相关音频、视频编码与传输协议类库3、要求与评分标准:(1)要求:在以上硬软件环境下,利用合适的开发工具,设

2、计一套可视对讲软件,实现局域网内两台计算机之间的可视对讲功能,要求音视频信号连续性、 实时性较好,满足正常交流需要。(2)评分标准系统原理分析( 20 分)1. 系统原理概述( 10 分)2. 关键技术分析( 10 分)系统总体方案设计( 30 分) 1. 按模块化设计要求画系统结构图(15 分)2 数据流分析( 15分)系统具体设计( 30 分)呼叫处理模块流程图与关键代码(6 分)音视频采集与播放模块流程图与关键代码(6 分)音视频处理(编解码)模块流程图与关键代码(6 分)音视频封包与解析模块流程图与关键代码(6 分)音视频发送与接收模块流程图与关键代码(6 分)系统测试与评价( 20)

3、实现语音通信( 6 分)实现视频通信( 6 分)实现音视频同步( 8 分)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 代码客户端请求连接线程(呼叫处理)关键代码如下:DWORD WINAPI ConnectThreadFunc(LPVOID pParam) CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam; ASSERT(pChatRoom ! = NULL); pChatR

4、oom -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 65

5、535 ) 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_ConnectSoc

6、k,(struct sockaddr*)&server, sizeof(struct sockaddr) = SOCKET_ERROR ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - AfxMessageBox(_T( 连接失败,请重试! ); goto _Error_End; pChatRoom-ShowMsg(_T( 系统信息:连接服务器成功!); while( TRUE ) if ( SOCKET_Select(pC

7、hatRoom-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); else pChatRoom-ShowMsg(_T( 聊天服务器已停止,请重新进行连接!); break; Sleep(500); _Error_End: closesocket(pChatRoom-m_ConnectSock); return TRUE; / 捕

8、获窗口BOOL VideoCapture:Initialize() char devname128=0,devversion128=0; int index=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - BOOL ret = TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE; TRACE(VideoCapture:Initializen); / 创建一个 AVICap 捕获窗口m_

9、capwnd = capCreateCaptureWindow(Capture,WS_POPUP,0,0,1,1,0,0); if(!m_capwnd) return FALSE; /connect callback functions ret = capSetUserData(m_capwnd,this); /Change destroy functions also. ret1 = capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); / 得到已安装的捕获设备的名称及版本ret2 = capGetDriverDescription(in

10、dex,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.WriteSt

11、ring(n Unable to connect driver to the window); m_capwnd=NULL; return FALSE; / Set the capture parameters if(SetCapturePara()=FALSE) / log.WriteString(n Setting capture parameters failed); capDriverDisconnect(m_capwnd); /使捕获窗口与一个捕获设备断开return FALSE; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -

12、- - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - return TRUE; 下面程序为设置 CAPTUREPARAMS 结构的实现代码:BOOL VideoCapture:SetCapturePara() CAPTUREPARMS CapParms=0; capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms); / 得到当前的捕获速度CapParms.fAbortLeftMouse = FALSE; CapParms.fAbortRightMouse = FALSE; Cap

13、Parms.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_b

14、mpinfo.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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12

15、页 - - - - - - - - - / 终止一个捕获任务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(CVideoEnDecodeNot

16、ify* 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.cpp bool CVideoEncoderX264:Conn

17、ect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item) CBase:Connect(pNotify, Item); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - ParseSize(Item.m_stSize); x264_param_default( ¶m ); param.i_threads = 1; param.i_frame_tot

18、al = 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 pi

19、c */ 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&

20、 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -

21、- - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - 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; i

22、nt 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_siz

23、e; 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -

24、 - - - - - - 第 9 页,共 12 页 - - - - - - - - - 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,len

25、gth,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);/从缓

26、冲区读取数据名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - startPos=serchStr(temp+endNum); /查找帧开始标志if(startPos!=-1) isStart=true; endNum=temp+endNum-startPos-4; memcpy(imageBuf,recBuf+startPos+4,endNum); /保存帧数据 else memcpy(recBuf,recBuf+temp+e

27、ndNum-3,3);/保存最后三个字节的数据endNum=3; else if(endNum4) /判定紧跟开始标志的数据,如果小于4 表示不能获得帧大小temp=recv(clisock,(char*)(recBuf),1000,0); /读入数据memcpy(imageBuf+endNum,recBuf,temp);/保存数据endNum+=temp; if(endNum4) continue; frameSize= *(int*)imageBuf);/获得帧大小if(frameSize50000) /异常处理(帧大小非法)isStart = false; /丢弃数据重新查找帧开始标志e

28、ndNum = 0; continue; frameSize-=endNum+4; else while(frameSize0&temp!=SOCKET_ERROR) /获得完整帧的剩余数据temp=recv(clisock,(char*)(imageBuf+endNum),frameSize,0); endNum+=temp; frameSize-=temp; if(frameSize=0) /帧结束置位,解压isStart=false; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - endNum=0; deCompress();/ 判断数据的有效性,调用ICDecompress 进行解压 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁