以下爲視頻通訊系統中的部分回調函數源碼:
具體可以在
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.