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

以下为视频通讯系统中的部分回调函数源码:

具体可以在

http://download.csdn.net/detail/little_rui/7969285

下载

可实现一对一、一对多、多对多的音视频通化要求,也满足文件传输,音视频文件录制等功能需求。

  1. /**
  2. *  视频数据回调函数
  3. */
  4. void CALLBACK VideoData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader, LPVOID lpUserValue)
  5. {
  6. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  7. if(pDemoDlg)
  8. pDemoDlg->DrawUserVideo(dwUserid,lpBuf,dwLen,bmiHeader);
  9. }
  10. /**
  11. *  音频数据回调函数
  12. */
  13. void CALLBACK AudioData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, WAVEFORMATEX waveFormatEx, LPVOID lpUserValue)
  14. {
  15. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  16. if(pDemoDlg)
  17. {
  18. // do something ...
  19. }
  20. }
  21. /**
  22. *  音量更改回调函数
  23. */
  24. void CALLBACK VolumeChange_CallBack(BRAC_AudioDevice device, DWORD dwCurrentVolume, LPVOID lpUserValue)
  25. {
  26. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  27. if(pDemoDlg)
  28. {
  29. if(device == BRAC_AD_WAVEIN)
  30. pDemoDlg->OnWaveInVolumeChange(dwCurrentVolume);
  31. else
  32. pDemoDlg->OnWaveOutVolumeChange(dwCurrentVolume);
  33. }
  34. }
  35. // 透明通道数据回调函数定义
  36. void CALLBACK TransBuffer_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)
  37. {
  38. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  39. if(pDemoDlg)
  40. {
  41. CString strNotify;
  42. strNotify.Format("TransBuffer_CallBack:dwUserid-%d, bufSize-%d",dwUserid,dwLen);
  43. pDemoDlg->AppendLogString(strNotify);
  44. }
  45. }
  46. // 透明通道数据扩展回调函数定义
  47. void CALLBACK TransBufferEx_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)
  48. {
  49. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  50. if(pDemoDlg)
  51. {
  52. BOOL bSuccess = FALSE;
  53. if(dwLen > 1000)
  54. {
  55. bSuccess = lpBuf[1000] == ‘Y‘ ? TRUE : FALSE;
  56. }
  57. CString strNotify;
  58. strNotify.Format("TransBufferEx_CallBack:dwUserid-%d, bufSize-%d,verify:%s",dwUserid,dwLen,bSuccess ? "Success" : "Fail");
  59. pDemoDlg->AppendLogString(strNotify);
  60. }
  61. }
  62. // 文件传输回调函数定义
  63. void CALLBACK TransFile_CallBack(DWORD dwUserid, LPCTSTR lpFileName, LPCTSTR lpTempFilePath, DWORD dwFileLength, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)
  64. {
  65. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  66. if(pDemoDlg)
  67. {
  68. CString strNotify;
  69. strNotify.Format("TransFile_CallBack:dwUserid-%d, lpFileName-%s, lpTempFilePath-%s",dwUserid,lpFileName,lpTempFilePath);
  70. pDemoDlg->AppendLogString(strNotify);
  71. }
  72. }
  73. // 录像、快照任务完成回调函数定义
  74. void CALLBACK RecordSnapShot_CallBack(DWORD dwUserid, LPCTSTR lpFileName, DWORD dwParam, BOOL bRecordType, LPVOID lpUserValue)
  75. {
  76. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  77. if(pDemoDlg)
  78. {
  79. CString strNotify;
  80. strNotify.Format("%s CallBack:dwUserid-%d, FilePathName-%s",bRecordType?"Record":"SnapShot",(int)dwUserid,lpFileName);
  81. pDemoDlg->AppendLogString(strNotify);
  82. }
  83. }
  84. // SDK Filter 通信数据回调函数定义
  85. void CALLBACK SDKFilterData_CallBack(LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)
  86. {
  87. CBRAnyChatSDKDemoDlg*   pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
  88. if(pDemoDlg)
  89. {
  90. CString strNotify;
  91. strNotify.Format("SDK Filter CallBack:%s",lpBuf);
  92. pDemoDlg->AppendLogString(strNotify);
  93. }
  94. }
  95. /**
  96. *  绘制用户视频
  97. *  数据来源于回调函数
  98. *  @param dwUserid 用户ID号
  99. *  @param lpBuf 视频数据缓冲区
  100. *  @param dwLen 缓冲区大小
  101. *  @param bmiHeader 视频缓冲区的头信息,包含了视频的大小、颜色位数等信息
  102. */
  103. void CBRAnyChatSDKDemoDlg::DrawUserVideo(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader)
  104. {
  105. // 根据用户ID号找到合适的显示区域
  106. DWORD dwSite = -1;
  107. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
  108. {
  109. if(m_iUserID[i] == (INT)dwUserid)
  110. {
  111. dwSite = i;
  112. break;
  113. }
  114. }
  115. if(dwSite == -1)
  116. return;
  117. CRect dispRect = m_UserRect[dwSite];
  118. //构建Bitmap
  119. BITMAPINFOHEADER  *lpbmi = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)+dwLen);
  120. ZeroMemory(lpbmi,sizeof(BITMAPINFOHEADER)+dwLen);
  121. memcpy((LPBYTE)lpbmi,&bmiHeader,sizeof(bmiHeader));
  122. memcpy(((LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)),lpBuf,dwLen);
  123. HDC hdc = ::GetDC(m_hWnd);
  124. HDC dcMem = ::CreateCompatibleDC(hdc);
  125. HBITMAP hBitmap = CreateDIBitmap(hdc,lpbmi,CBM_INIT,(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER),(LPBITMAPINFO)lpbmi,DIB_RGB_COLORS);
  126. //绘图
  127. HBITMAP holdbm = (HBITMAP)SelectObject(dcMem,hBitmap);
  128. ::SetStretchBltMode(hdc,COLORONCOLOR);
  129. ::StretchBlt(hdc,dispRect.left,dispRect.top,dispRect.Width(),dispRect.Height(),dcMem,0,0,bmiHeader.biWidth,bmiHeader.biHeight,SRCCOPY);
  130. SelectObject(dcMem,holdbm);
  131. ::DeleteDC(dcMem);
  132. ::DeleteObject(hBitmap);
  133. ::ReleaseDC(m_hWnd,hdc);
  134. free(lpbmi);
  135. lpbmi = NULL;
  136. }
  137. BOOL CBRAnyChatSDKDemoDlg::OnInitDialog()
  138. {
  139. CDialog::OnInitDialog();
  140. // IDM_ABOUTBOX must be in the system command range.
  141. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  142. ASSERT(IDM_ABOUTBOX < 0xF000);
  143. CMenu* pSysMenu = GetSystemMenu(FALSE);
  144. if (pSysMenu != NULL)
  145. {
  146. CString strAboutMenu;
  147. strAboutMenu.LoadString(IDS_ABOUTBOX);
  148. if (!strAboutMenu.IsEmpty())
  149. {
  150. pSysMenu->AppendMenu(MF_SEPARATOR);
  151. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  152. }
  153. }
  154. SetIcon(m_hIcon, TRUE);         // Set big icon
  155. SetIcon(m_hIcon, FALSE);        // Set small icon
  156. // 初始化每个视频显示位置信息
  157. GetDlgItem(IDC_STATIC_USER0)->ShowWindow(SW_HIDE);
  158. GetDlgItem(IDC_STATIC_USER0)->GetClientRect(m_UserRect[0]);
  159. GetDlgItem(IDC_STATIC_USER0)->ClientToScreen(m_UserRect[0]);
  160. ScreenToClient(m_UserRect[0]);
  161. GetDlgItem(IDC_STATIC_USER1)->ShowWindow(SW_HIDE);
  162. GetDlgItem(IDC_STATIC_USER1)->GetClientRect(m_UserRect[1]);
  163. GetDlgItem(IDC_STATIC_USER1)->ClientToScreen(m_UserRect[1]);
  164. ScreenToClient(m_UserRect[1]);
  165. GetDlgItem(IDC_STATIC_USER2)->ShowWindow(SW_HIDE);
  166. GetDlgItem(IDC_STATIC_USER2)->GetClientRect(m_UserRect[2]);
  167. GetDlgItem(IDC_STATIC_USER2)->ClientToScreen(m_UserRect[2]);
  168. ScreenToClient(m_UserRect[2]);
  169. GetDlgItem(IDC_STATIC_USER3)->ShowWindow(SW_HIDE);
  170. GetDlgItem(IDC_STATIC_USER3)->GetClientRect(m_UserRect[3]);
  171. GetDlgItem(IDC_STATIC_USER3)->ClientToScreen(m_UserRect[3]);
  172. ScreenToClient(m_UserRect[3]);
  173. // 隐藏录像状态标志
  174. GetDlgItem(IDC_STATIC_RECORDSTATE0)->ShowWindow(SW_HIDE);
  175. GetDlgItem(IDC_STATIC_RECORDSTATE1)->ShowWindow(SW_HIDE);
  176. GetDlgItem(IDC_STATIC_RECORDSTATE2)->ShowWindow(SW_HIDE);
  177. GetDlgItem(IDC_STATIC_RECORDSTATE3)->ShowWindow(SW_HIDE);
  178. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
  179. {
  180. m_iUserID[i] = -1;
  181. }
  182. m_dwTransTaskId = -1;
  183. m_iPort = 8906;
  184. m_iRoomId = 1;
  185. SetDlgItemText(IDC_IPADDRESS_SERVER,"demo.anychat.cn");
  186. SetDlgItemText(IDC_EDIT_USERNAME,"AnyChat5");
  187. UpdateData(FALSE);
  188. return TRUE;  // return TRUE  unless you set the focus to a control
  189. }
  190. void CBRAnyChatSDKDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
  191. {
  192. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  193. {
  194. CAboutDlg dlgAbout;
  195. dlgAbout.DoModal();
  196. }
  197. else
  198. {
  199. CDialog::OnSysCommand(nID, lParam);
  200. }
  201. }
  202. // If you add a minimize button to your dialog, you will need the code below
  203. //  to draw the icon.  For MFC applications using the document/view model,
  204. //  this is automatically done for you by the framework.
时间: 2024-10-03 21:39:37

C++音视频通讯demo源码下载的相关文章

视频通讯 demo源码下载

以下为视频通讯系统中的部分回调函数源码: 具体可以在 http://download.csdn.net/detail/little_rui/7969285 下载 /** *  视频数据回调函数 */ void CALLBACK VideoData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader, LPVOID lpUserValue) { CBRAnyChatSDKDemoDlg*   

spring mvc+ibatis+mysql的组合框架入门实例demo源码下载

原文:spring mvc+ibatis+mysql的组合框架入门实例demo源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463678958592.htm spring mvc+ibatis+mysql的组合框架实例 首页 http://localhost:端口/项目/index.jsp 添加用户 添加地址 项目截图 jar包截图

高清视频会议 视频聊天室源码下载

高清视频会议.视频聊天室源码简介: "SDK即时通讯平台"是一套跨平台的即时通讯解决方案,基于先进的H.264视频编码标准.AAC音频编码标准与P2P技术,支持高清视频,整合了佰锐在音视频编码.多媒体通讯领域领先的开发技术和丰富的产品经验而设计的高质量.宽适应性.分布式.模块化的网络音视频互动平台 成熟产品可提供全套系统示例源代码(包服务端,客户端)下载地址http://download.csdn.net/detail/little_rui/7969285,同时有完善的开发文档指南,且

Android L / 5.0 帮助文档 API21文档 sample demo源码 下载

如无法登陆google,浏览android官网也是问题,这里提供android L的官方文档资料下载.API版本21 参考文档较大,解压后最好使用IE浏览器打开,并工具选项卡中设置为脱机工作模式, 如是,则打开文档速度会加快许多.否则发送js请求等待google响应,会出现加载十分缓慢的现象. 也可修改网页源码,使之不发送访问google的请求,请自行百度,etc 如果想用google搜索,又无法打开google网站,可以试用下谷粉搜索 http://www.gfsoso.com/ Androi

音视频框架ffmpeg源码的简要分析

感谢http://m.2cto.com/kf/201201/116171.html这里一系列的文章 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我也搞得希里糊涂的,先不管它了. ffmpeg的主要功能是音视频的转换和处理.其功能之强大已经到了匪夷所思的地步(有点替它吹了).它的主要特点是能做到把多个输入文件中的任意几个流重新组合

Android 音视频深入 六 使用FFmpeg播放视频(附源码下载)

本篇项目地址,求starhttps://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91 首先FFmpeg是c语言写的,所以我们需要NDK的技术,然后我使用的NDK使用Cmake的,一开始就是说如何将FFmpeg导入项目,使用我的方法导入FFmpeg不用一分钟. 这个需要大家先在上面的代码地址里下载项目代码因为FFmpeg这个

如何才能拍摄出高清无码?(附源码下载!)

要想拍摄出高清无码,摄像头很关键. 摄像头有两个重要的参数,一个是分辨率,一个是帧频. 附:设备测试demo源码下载 一.笔记本的自带摄像头的参数 Size就是摄像头的分辨率,MaxFrameRate是指摄像头采集能达到的最大帧频. 当然,我这个摄像头比较low,录制高清无码肯定是不行的. 二.外接摄像头测出来的参数. 附:设备测试demo源码下载 三.选定摄像头的分辨率和帧频来录制视频 现在选定的是1280*720,帧频为30fps. 录制得到的视频的参数信息如下: 附:视频录制demo源码下

微信小程序源码下载(200多个)

微信小程序源码下载汇总,点击标题进入对应的微信小程序下载页面. 最新 demo源码(点击标题进入帖子下载) 描述 1 微信小程序 会议室预定小程序 微信小程序 会议室预定小程序**** 本内容被作者隐藏 **** 2 微信小程序-双人五子棋小游戏 微信小程序-双人五子棋小游戏**** 本内容被作者隐藏 **** 3 打卡签到小程序 用微信小程序实现的一个简单的打卡签到的小程序拒绝 4 微信小程序---左滑删除 微信小程序---左滑删除**** 本内容被作者隐藏 **** 5 一个借钱的记事本的微

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i