基于wince的網(wǎng)絡(luò)音視頻通信方案解析_第1頁
基于wince的網(wǎng)絡(luò)音視頻通信方案解析_第2頁
基于wince的網(wǎng)絡(luò)音視頻通信方案解析_第3頁
基于wince的網(wǎng)絡(luò)音視頻通信方案解析_第4頁
基于wince的網(wǎng)絡(luò)音視頻通信方案解析_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于wince的網(wǎng)絡(luò)音視頻通信方案解析wince網(wǎng)絡(luò)音視頻通訊下位機為mini2440,其操作系統(tǒng)是WINCE5.0,需要在下位機上插入USB攝像頭(中星微301,驅(qū)動為15分鐘限制版),以及插入麥克風(fēng)耳機;上位機為普通的PC,需要插入麥克風(fēng)耳機;上位機和下位機的開發(fā)環(huán)境為VisualStudio2005。接下來,說說這個東東的功能,和工作原理:網(wǎng)絡(luò)視頻傳輸,首先把mini2440與USB攝像頭連接在一起,通過USB攝像頭捕捉圖像(320x240,15fps),然后通過UDP協(xié)議發(fā)送至PC端,在PC屏幕上以15fpswince網(wǎng)絡(luò)音視頻通訊下位機為 mini2440 ,其操作系統(tǒng)是WINCE

2、5.0,需要在下位機上插入USB攝像頭(中星微301,驅(qū)動為15分鐘限制版),以及插入麥克風(fēng)耳機;上位機為普通的PC,需要插入麥克風(fēng)耳機;上位機和下位機的開發(fā)環(huán)境為Visual Studio 2005。接下來,說說這個東東的功能,和工作原理:網(wǎng)絡(luò)視頻傳輸,首先把mini2440與USB攝像頭連接在一起,通過USB攝像頭捕捉圖像(320 x 240,15fps),然后通過UDP協(xié)議發(fā)送至PC端,在PC屏幕上以15fps的速度顯示。網(wǎng)絡(luò)音頻傳輸,首先在mini2440和PC上都插入麥克風(fēng)耳機,兩者都同時錄音,并以G.726編碼,然后把壓縮包通過UDP協(xié)議發(fā)送至對方,而在錄音的同時,也對來自對方的壓

3、縮包用G.726解碼,然后再在耳機播放音頻。最后,說說這個版本相對于以前的改進:把以前的RTP改為UDP,實踐證明,在這個系統(tǒng)中,用UDP的效率會比RTP好,畢竟不需要用到RTP的流量監(jiān)測等高級功能,僅僅能通信就行了;以前版本基于100M網(wǎng)卡,現(xiàn)在支持10M網(wǎng)卡了,在100M網(wǎng)卡的機器上,可以直接把JPEG圖片發(fā)過去,但是,在10M的網(wǎng)卡是,每次數(shù)據(jù)包最大為1440比特,因此要兼容10M網(wǎng)卡,就需要把圖像分割成多個1440大小的數(shù)據(jù)包,分別發(fā)送了。網(wǎng)絡(luò)音視頻通信下面說說關(guān)鍵的源代碼:以下是WINCE部分的代碼#pragma once#include “winsock2.h”/RTP支持#inc

4、lude “。.UDPUDP.h”/音頻支持#include “WaveIn.h”#include “WaveOut.h”/G726支持#include “g726.h”/攝像頭支持#include “。videozc030xlib.h”#define Video_Width 320 /視頻寬度#define Video_Height 240 /視頻長度#define AudioData_Size 960 /每塊音頻數(shù)據(jù)包的大小#define Compr_AudioData_Size 120 /壓縮后音頻塊的大小/音頻輸入輸出變量CWaveIn *g_pIn;CWaveOut *g_pOut;

5、char pinAudioData_Size,poutCompr_AudioData_Size;char waveoutAudioData_Size;/攝像頭輸入變量DWORD dwSize;DWORD dwJpg;DWORD dwRtnSize2;/* 0 - for bmp, 1 - for jpeg */LPBYTE lpFrameBuffer;LPBYTE lpJpgBuffer ;/控制變量bool isCameraEnabled;/UDPCUDP_CE m_CEUdp;class AVClasspublic:/=/ 語法格式: void InitAV(CWnd * p)/ 實現(xiàn)功能

6、: 初始化音頻和視頻,用于錄音、播放音頻,以及播放視頻/ 參數(shù): p為窗口類指針/ 返回值: 無/=void InitAV(CWnd * p,int local_port,CString remote_ip,int remote_port)/-初始化UDP-/m_CEUdp.m_OnUdpRecv = OnUdpCERecv;DWORD nResult = m_CEUdp.Open(p,local_port,remote_ip,remote_port);if (nResult =0)AfxMessageBox(_T(“打開端口失敗”);return;/-控制變量-/isCameraEnable

7、d=false;/-視頻-/int i = capInitCamera();dwSize = 320 * 240 * 3;dwJpg = 40960;lpFrameBuffer = (LPBYTE) malloc (dwSize);lpJpgBuffer = (LPBYTE) malloc (dwJpg);if(i=0)/:MessageBox(NULL, L“Init camera error ”, L“Notice”, 0);goto video_error;/出錯,釋放空間.if (0 != capSetVideoFormat(0, VIDEO_PALETTE_RGB24, VIDEO_

8、SIZE_SIF)/:MessageBox(NULL, L“SetVideoFormat error ”, L“Notice”, 0);goto video_error;/出錯,釋放空間if (capStartCamera(0) != 0)/:MessageBox(NULL, L“StartCamera error ”, L“Notice”, 0);capStopCamera(0);goto video_error;/出錯,釋放空間/沒出錯,進行視頻(控制狀態(tài))、音頻設(shè)置isCameraEnabled=true;goto audio;video_error:free (lpFrameBuffe

9、r);lpFrameBuffer = NULL;free (lpJpgBuffer);lpJpgBuffer = NULL;/-音頻-/audio:g_pOut = new CWaveOut();g_pIn = new CWaveIn();g_pOut-StartPlay();g_pIn-StartRec(OnRecCapAndSend,(DWORD)p);/=/ 語法格式: void FreeAV()/ 實現(xiàn)功能: 釋放音頻、視頻/ 參數(shù): 無/ 返回值: 無/=void FreeAV()/-視頻-/if(isCameraEnabled)capStopCamera(0);/-音頻-/g_pO

10、ut-StopPlay();g_pIn-StopRec();delete g_pOut;delete g_pIn;/-UDP-/m_CEUdp.Close();/=/ 語法格式: void RecAndPlay(WPARAM wParam,LPARAM lParam)/ 實現(xiàn)功能: 接收網(wǎng)絡(luò)傳來的音頻,以及播放/ 參數(shù): wParam,表示數(shù)據(jù);lParam,表示數(shù)據(jù)長度/ 返回值: 無/=static void CALLBACK OnUdpCERecv(CWnd * pWnd,char* buf,int nLen,sockaddr * addr)g726_Decode(buf,(unsign

11、ed char*)waveout);g_pOut-Play(waveout,AudioData_Size);/=/ 語法格式: static void OnRecCapAndSend(char *data,int length,DWORD userdata)/ 實現(xiàn)功能: 錄音,攝像并且發(fā)送/ 參數(shù): data表示數(shù)據(jù),length表示數(shù)據(jù)長度,userdata暫時沒用/ 返回值: 無/=f=static void OnRecCapAndSend(char *data,int length,DWORD userdata)/-音頻-/memcpy(pin,g_pIn-buffer,AudioDa

12、ta_Size);g726_Encode(unsigned char*)pin,pout);m_CEUdp.SendData(pout,Compr_AudioData_Size);/-視頻-/if(isCameraEnabled=false)/如果程序不能用攝像頭return;Sleep(15);int index=0;memset(lpFrameBuffer, 0, dwSize);memset(lpJpgBuffer, 0, dwJpg);dwRtnSize0 = dwRtnSize1 = 0;if (capGetPicture(index, lpFrameBuffer, dwSize,

13、lpJpgBuffer, dwJpg, dwRtnSize) = 0)/ m_CEUdp.SendData(const char *)lpJpgBuffer,dwRtnSize1);char tmp1440;int tmp_i=0;for(int i=0;idwRtnSize1;i+)tmptmp_i=lpJpgBufferi;tmp_i+;if(tmp_i=1440)m_CEUdp.SendData(tmp,1440);tmp_i=0;else if(i=dwRtnSize1-1)m_CEUdp.SendData(tmp,dwRtnSize1-(dwRtnSize1/1440)*1440);

14、tmp_i=0;以下是PC部分的關(guān)鍵代碼#pragma once#include “winsock2.h”/UDP支持#include “。.UDPUDP.h”/音頻支持#include “WaveIn.h”#include “waveout.h”/G726支持#include “g726.h”/視頻支持#include “Gdiplus.h”using namespace Gdiplus;#define VideoData_Size 1440 /每塊視頻數(shù)據(jù)包的大小#define Video_Width 320 /視頻寬度#define Video_Height 240 /視頻長度#defi

15、ne AudioData_Size 960 /每塊音頻數(shù)據(jù)包的大小#define Compr_AudioData_Size 120 /壓縮后音頻塊的大小/音頻輸入輸出變量CWaveIn *g_pIn;CWaveOut *g_pOut;char pinAudioData_Size,poutCompr_AudioData_Size;char wave_dataAudioData_Size;/UDP變量CUDP_CE m_CEUdp;/視頻輸入變量GdiplusStartupInput m_gdiPlusInPut;ULONG_PTR m_gdiPlusToken;char video_dataVi

16、deo_Width*Video_Height;int index;/視頻數(shù)據(jù)當前索引class AVClassprivate:public:/=/ 語法格式: void InitAV(CWnd * p)/ 實現(xiàn)功能: 初始化音頻和視頻,用于錄音、播放音頻,以及播放視頻/ 參數(shù): p為窗口類指針/ 返回值: 無/=void InitAV(CWnd * p,int local_port,CString remote_ip,int remote_port)./-UDP連接-/m_CEUdp.m_OnUdpRecv = OnUdpCERecv;DWORD nResult = m_CEUdp.Open(

17、p,local_port,remote_ip,remote_port);if (nResult =0)AfxMessageBox(_T(“打開端口失敗”);return;/-音頻-/g_pOut = new CWaveOut();g_pIn = new CWaveIn();g_pOut-StartPlay();g_pIn-StartRec(OnRecording,(DWORD)p);/-視頻-/GdiplusStartup( &m_gdiPlusToken, &m_gdiPlusInPut, NULL ); /初始化GDI+memset(video_data,0,Video_Width*Vid

18、eo_Height);index=0;/=/ 語法格式: void FreeAV()/ 實現(xiàn)功能: 釋放音頻、視頻/ 參數(shù): 無/ 返回值: 無/=void FreeAV()/-音頻-/g_pOut-StopPlay();g_pIn-StopRec();delete g_pOut;delete g_pIn;/-視頻-/GdiplusShutdown(m_gdiPlusToken); /銷毀GDI+/-UDP-/m_CEUdp.Close();/=/ 語法格式: void RecAndPlay(WPARAM wParam,LPARAM lParam,HWND hwnd)/ 實現(xiàn)功能: 接收網(wǎng)絡(luò)傳

19、來的音頻,以及播放/ 參數(shù): wParam,表示數(shù)據(jù);lParam,表示數(shù)據(jù)長度;hwnd,表示顯示視頻的窗口句柄/ 返回值: 無/=static void CALLBACK OnUdpCERecv(CWnd *pWnd,char* buf,int nLen,sockaddr * addr)/*測試收到的數(shù)據(jù)大小CString tmp;tmp.Format(L“%d”,nLen);MessageBox(0,tmp,0,0);return;*/-如果是音頻數(shù)據(jù)-/if(nLen=Compr_AudioData_Size)g726_Decode(buf,(unsigned char*)wave_d

20、ata);g_pOut-Play(wave_data,AudioData_Size);return;/-如果是視頻數(shù)據(jù)-/if(nLen=VideoData_Size)/完整的視頻數(shù)據(jù)塊for(int i=0;inLen;i+)video_dataindex=bufi;index+;return;/視頻數(shù)據(jù)塊的最后一塊for(int i=0;inLen;i+)video_dataindex=bufi;index+;/如果JPEG圖像特別大,則肯定是出錯,則拋棄if(indexVideo_Width*Video_Height)/MessageBox(0,“緩沖區(qū)出錯”,“錯誤信息”,0);ret

21、urn;tryIPicture *pPic;IStream *pStm ;/分配全局存儲空間HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,index);LPVOID pvData=NULL ;/鎖定分配內(nèi)存塊pvData=GlobalLock(hGlobal);/復(fù)制數(shù)據(jù)包video_data到pvDatamemcpy(pvData,video_data,index);GlobalUnlock(hGlobal);CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);ULARGE_INTEGER pSeek;LARGE_INTEGER dlibMove = 0 ;pStm-Seek(dlibMove,STREAM_SEEK_SET ,&pSeek);/ Sleep(15);/裝入圖形文件if(FAILED(OleLoadPicture(pStm,index,TRUE,IID_IPicture,(LPVOID*)&pPic)/附:如果video_data這個數(shù)組包含的圖像有錯,則OleLoadPict

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論