您的位置:首页 > 编程语言 > C语言/C++

C++音视频通讯demo源码下载

2015-01-09 10:09 274 查看
以下为视频通讯系统中的部分回调函数源码:
具体可以在 http://download.csdn.net/detail/little_rui/7969285 下载
可实现一对一、一对多、多对多的音视频通化要求,也满足文件传输,音视频文件录制等功能需求。

/**
* 视频数据回调函数
*/
void CALLBACK VideoData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
pDemoDlg->DrawUserVideo(dwUserid,lpBuf,dwLen,bmiHeader);

}
/**
* 音频数据回调函数
*/
void CALLBACK AudioData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, WAVEFORMATEX waveFormatEx, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
// do something ...
}
}

/**
* 音量更改回调函数
*/
void CALLBACK VolumeChange_CallBack(BRAC_AudioDevice device, DWORD dwCurrentVolume, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
if(device == BRAC_AD_WAVEIN)
pDemoDlg->OnWaveInVolumeChange(dwCurrentVolume);

else
pDemoDlg->OnWaveOutVolumeChange(dwCurrentVolume);

}
}
// 透明通道数据回调函数定义
void CALLBACK TransBuffer_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
CString strNotify;
strNotify.Format("TransBuffer_CallBack:dwUserid-%d, bufSize-%d",dwUserid,dwLen);

pDemoDlg->AppendLogString(strNotify);
}
}

// 透明通道数据扩展回调函数定义
void CALLBACK TransBufferEx_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
BOOL bSuccess = FALSE;

if(dwLen > 1000)
{
bSuccess = lpBuf[1000] == 'Y' ? TRUE : FALSE;

}
CString strNotify;
strNotify.Format("TransBufferEx_CallBack:dwUserid-%d, bufSize-%d,verify:%s",dwUserid,dwLen,bSuccess ? "Success" : "Fail");

pDemoDlg->AppendLogString(strNotify);
}
}
// 文件传输回调函数定义
void CALLBACK TransFile_CallBack(DWORD dwUserid, LPCTSTR lpFileName, LPCTSTR lpTempFilePath, DWORD dwFileLength, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
CString strNotify;
strNotify.Format("TransFile_CallBack:dwUserid-%d, lpFileName-%s, lpTempFilePath-%s",dwUserid,lpFileName,lpTempFilePath);

pDemoDlg->AppendLogString(strNotify);
}
}

// 录像、快照任务完成回调函数定义
void CALLBACK RecordSnapShot_CallBack(DWORD dwUserid, LPCTSTR lpFileName, DWORD dwParam, BOOL bRecordType, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
CString strNotify;
strNotify.Format("%s CallBack:dwUserid-%d, FilePathName-%s",bRecordType?"Record":"SnapShot",(int)dwUserid,lpFileName);

pDemoDlg->AppendLogString(strNotify);
}
}

// SDK Filter 通信数据回调函数定义
void CALLBACK SDKFilterData_CallBack(LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)

{
CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;

if(pDemoDlg)
{
CString strNotify;
strNotify.Format("SDK Filter CallBack:%s",lpBuf);

pDemoDlg->AppendLogString(strNotify);
}
}

/**
* 绘制用户视频
* 数据来源于回调函数
* @param dwUserid 用户ID号
* @param lpBuf 视频数据缓冲区
* @param dwLen 缓冲区大小
* @param bmiHeader 视频缓冲区的头信息,包含了视频的大小、颜色位数等信息

*/
void CBRAnyChatSDKDemoDlg::DrawUserVideo(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader)

{
// 根据用户ID号找到合适的显示区域
DWORD dwSite = -1;

for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)

{
if(m_iUserID[i] == (INT)dwUserid)

{
dwSite = i;
break;
}
}
if(dwSite == -1)
return;

CRect dispRect = m_UserRect[dwSite];

//构建Bitmap
BITMAPINFOHEADER *lpbmi = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)+dwLen);

ZeroMemory(lpbmi,sizeof(BITMAPINFOHEADER)+dwLen);

memcpy((LPBYTE)lpbmi,&bmiHeader,sizeof(bmiHeader));

memcpy(((LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)),lpBuf,dwLen);

HDC hdc = ::GetDC(m_hWnd);

HDC dcMem = ::CreateCompatibleDC(hdc);

HBITMAP hBitmap = CreateDIBitmap(hdc,lpbmi,CBM_INIT,(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER),(LPBITMAPINFO)lpbmi,DIB_RGB_COLORS);

//绘图
HBITMAP holdbm = (HBITMAP)SelectObject(dcMem,hBitmap);

::SetStretchBltMode(hdc,COLORONCOLOR);
::StretchBlt(hdc,dispRect.left,dispRect.top,dispRect.Width(),dispRect.Height(),dcMem,0,0,bmiHeader.biWidth,bmiHeader.biHeight,SRCCOPY);

SelectObject(dcMem,holdbm);
::DeleteDC(dcMem);
::DeleteObject(hBitmap);
::ReleaseDC(m_hWnd,hdc);
free(lpbmi);
lpbmi = NULL;
}

BOOL CBRAnyChatSDKDemoDlg::OnInitDialog()

{
CDialog::OnInitDialog();

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}
}

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// 初始化每个视频显示位置信息
GetDlgItem(IDC_STATIC_USER0)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_USER0)->GetClientRect(m_UserRect[0]);

GetDlgItem(IDC_STATIC_USER0)->ClientToScreen(m_UserRect[0]);

ScreenToClient(m_UserRect[0]);

GetDlgItem(IDC_STATIC_USER1)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_USER1)->GetClientRect(m_UserRect[1]);

GetDlgItem(IDC_STATIC_USER1)->ClientToScreen(m_UserRect[1]);

ScreenToClient(m_UserRect[1]);

GetDlgItem(IDC_STATIC_USER2)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_USER2)->GetClientRect(m_UserRect[2]);

GetDlgItem(IDC_STATIC_USER2)->ClientToScreen(m_UserRect[2]);

ScreenToClient(m_UserRect[2]);

GetDlgItem(IDC_STATIC_USER3)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_USER3)->GetClientRect(m_UserRect[3]);

GetDlgItem(IDC_STATIC_USER3)->ClientToScreen(m_UserRect[3]);

ScreenToClient(m_UserRect[3]);

// 隐藏录像状态标志
GetDlgItem(IDC_STATIC_RECORDSTATE0)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_RECORDSTATE1)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_RECORDSTATE2)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_STATIC_RECORDSTATE3)->ShowWindow(SW_HIDE);

for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)

{
m_iUserID[i] = -1;
}

m_dwTransTaskId = -1;

m_iPort = 8906;
m_iRoomId = 1;
SetDlgItemText(IDC_IPADDRESS_SERVER,"demo.anychat.cn");

SetDlgItemText(IDC_EDIT_USERNAME,"AnyChat5");

UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control

}

void CBRAnyChatSDKDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)

{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: