




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 部編人教版五年級上冊語文10、牛郎織女(一) 教案
- 2025年中國PTFE耐高溫漆布數據監測研究報告
- 2025年中國PDP制造設備數據監測報告
- 2025年中國HIPS雙色片材數據監測報告
- 2025年中國C/6.NET系統數據監測報告
- 2025年中國1.61超薄非球面樹脂鏡片數據監測報告
- 2025至2030年中國高壓固定式開關柜市場分析及競爭策略研究報告
- 2025至2030年中國鋰電池殼市場分析及競爭策略研究報告
- 2025至2030年中國速裝壓痕膜市場分析及競爭策略研究報告
- 2025至2030年中國行星擺線針輪減速機市場分析及競爭策略研究報告
- 短期培訓財務管理制度
- 口腔診所前臺主管述職報告
- 2024年廣東“三支一扶”計劃招募筆試真題
- 設備租賃方案(3篇)
- 公關費用標準管理制度
- 2025-2030年中國潔凈室風扇過濾單元行業市場現狀供需分析及投資評估規劃分析研究報告
- AI大模型賦能數字農業農村數字鄉村建設方案
- 綜合實踐:畫數學連環畫(大單元教學設計)一年級數學下冊北師大版2025
- 2025年大學英語六級考試試卷及答案
- 詐騙還款協議書范本
- 2025年教師參加初中英語新教材培訓心得體會
評論
0/150
提交評論