基于wince的網(wǎng)絡(luò)音視頻通信
wince網(wǎng)絡(luò)音視頻通訊
本文引用地址:http://m.butianyuan.cn/article/166249.htm
下位機(jī)為 mini2440 ,其操作系統(tǒng)是WINCE 5.0,需要在下位機(jī)上插入USB攝像頭(中星微301,驅(qū)動為15分鐘限制版),以及插入麥克風(fēng)耳機(jī);
上位機(jī)為普通的PC,需要插入麥克風(fēng)耳機(jī);
上位機(jī)和下位機(jī)的開發(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)耳機(jī),兩者都同時錄音,并以G.726編碼,然后把壓縮包通過UDP協(xié)議發(fā)送至對方,而在錄音的同時,也對來自對方的壓縮包用G.726解碼,然后再在耳機(jī)播放音頻。
最后,說說這個版本相對于以前的改進(jìn):
把以前的RTP改為UDP,實(shí)踐證明,在這個系統(tǒng)中,用UDP的效率會比RTP好,畢竟不需要用到RTP的流量監(jiān)測等高級功能,僅僅能通信就行了;
以前版本基于100M網(wǎng)卡,現(xiàn)在支持10M網(wǎng)卡了,在100M網(wǎng)卡的機(jī)器上,可以直接把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支持
#include “。.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;
char pin[AudioData_Size],pout[Compr_AudioData_Size];
char waveout[AudioData_Size];
//攝像頭輸入變量
DWORD dwSize;
DWORD dwJpg;
DWORD dwRtnSize[2];/* 0 - for bmp, 1 - for jpeg */
LPBYTE lpFrameBuffer;
LPBYTE lpJpgBuffer ;
//控制變量
bool isCameraEnabled;
//UDP
CUDP_CE m_CEUdp;
class AVClass
{
public:
//=====================================================================
// 語法格式: void InitAV(CWnd * p)
// 實(shí)現(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(p,local_port,remote_ip,remote_port);
if (nResult 《=0)
{
AfxMessageBox(_T(“打開端口失敗”));
return;
}
//------------------------控制變量-----------------------//
isCameraEnabled=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;//出錯,釋放空間
}
評論