⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avclass.h

📁 基于ARM9(Wince)的网络音视频通信
💻 H
字号:

#pragma once
#include "winsock2.h"
//RTP支持
#include "..\UDP\UDP.h"

//音频支持
#include "WaveIn.h"
#include "WaveOut.h"

//G726支持
#include "g726.h"

//摄像头支持
#include ".\video\\zc030xlib.h"

#define Video_Width 320 //视频宽度
#define Video_Height 240 //视频长度
#define AudioData_Size 960  //每块音频数据包的大小
#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)
	//	实现功能:	初始化音频和视频,用于录音、播放音频,以及播放视频
	//	参数:	  	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;//出错,释放空间
		}
		if (0 != capSetVideoFormat(0, VIDEO_PALETTE_RGB24, VIDEO_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;//出错,释放空间
		}
		//没出错,进行视频(控制状态)、音频设置
		isCameraEnabled=true;
		goto audio;
video_error:	
		free (lpFrameBuffer);
		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()
	//	实现功能:	释放音频、视频
	//	参数:	  	无
	//	返回值:  	无
	//=====================================================================
	void FreeAV()
	{
		//-------------------------视频--------------------------//
		if(isCameraEnabled)
			capStopCamera(0);
		//-------------------------音频--------------------------//
		g_pOut->StopPlay();
		g_pIn->StopRec();
		delete g_pOut;
		delete g_pIn;
        //------------------------UDP------------------------//
		m_CEUdp.Close();
	}



	//=====================================================================
	//	语法格式:	void RecAndPlay(WPARAM wParam,LPARAM lParam)
	//	实现功能:	接收网络传来的音频,以及播放
	//	参数:	  	wParam,表示数据;lParam,表示数据长度
	//	返回值:  	无
	//=====================================================================
	static void CALLBACK OnUdpCERecv(CWnd * pWnd,char* buf,int nLen,sockaddr * addr)
	{
		g726_Decode(buf,(unsigned char*)waveout);
		
		g_pOut->Play(waveout,AudioData_Size);
	}


	//=====================================================================
	//	语法格式:	static void OnRecCapAndSend(char *data,int length,DWORD userdata)
	//	实现功能:	录音,摄像并且发送
	//	参数:	  	data表示数据,length表示数据长度,userdata暂时没用
	//	返回值:  	无
	//=====================================f================================
	static void OnRecCapAndSend(char *data,int length,DWORD userdata)
	{
		//-------------------------音频--------------------------//
		memcpy(pin,g_pIn->buffer,AudioData_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);
		dwRtnSize[0] = dwRtnSize[1] = 0;
		if (capGetPicture(index, lpFrameBuffer, dwSize, lpJpgBuffer, dwJpg, dwRtnSize) == 0)
		{
			/// m_CEUdp.SendData((const char *)lpJpgBuffer,dwRtnSize[1]);
			char tmp[1440];
			int tmp_i=0;
			for(int i=0;i<dwRtnSize[1];i++)
			{
                tmp[tmp_i]=lpJpgBuffer[i];
				tmp_i++;
				if(tmp_i==1440)
				{
					m_CEUdp.SendData(tmp,1440);
					tmp_i=0;
					
				}
				else if(i==dwRtnSize[1]-1)
				{
					m_CEUdp.SendData(tmp,dwRtnSize[1]-(dwRtnSize[1]/1440)*1440);
					tmp_i=0;
				}
			}


		}

       
	}
  

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -