AnyChat技术支持论坛

标题: 利用视频数据回调函数绘制视频 [打印本页]

作者: hk92    时间: 2016-1-5 14:38
标题: 利用视频数据回调函数绘制视频
您好,请问有没有关于利用视频数据回调函数来绘制视频的相关demo(c#)?

作者: 佰锐科技-邵光清    时间: 2016-1-5 14:47
您好,视频数据回调函数拿到视频数据之后,Anychat默认自动显示,Windows平台AnyChat视频显示
所以,C#的示例程序参见src\client\c#。
作者: hk92    时间: 2016-1-5 14:50
佰锐科技-邵光清 发表于 2016-1-5 14:47
您好,视频数据回调函数拿到视频数据之后,Anychat默认自动显示,Windows平台AnyChat视频显示
所以,C#的 ...

您好,根据文档说明“如果没有设置自动显示标志,而只设置了回调视频数据(BRAC_FUNC_VIDEO_CBDATA)标志时,AnyChat内部不会显示视频,而是将视频数据通过回调的方式(130. 视频数据回调函数)提交给应用程序,由应用程序自己来绘制;”
由于只有一路视频源,我想多路显示出来,只有利用视频数据回调函数的方法才能显示出来,所以,我想问一下,利用视频数据回调函数绘制视频的方法(c#)?
作者: 佰锐科技-邵光清    时间: 2016-1-5 15:07
hk92 发表于 2016-1-5 14:50
您好,根据文档说明“如果没有设置自动显示标志,而只设置了回调视频数据(BRAC_FUNC_VIDEO_CBDATA)标志 ...

您好,可以的,多路显示的视频绘制方面需要您自己来实现。
作者: hk92    时间: 2016-1-5 15:12
佰锐科技-邵光清 发表于 2016-1-5 15:07
您好,可以的,多路显示的视频绘制方面需要您自己来实现。

您好,请问有这方面的demo吗(c#)?
作者: 佰锐科技-邵光清    时间: 2016-1-5 15:23
hk92 发表于 2016-1-5 15:12
您好,请问有这方面的demo吗(c#)?

您好,一路视频源多路显示,我们没有这个demo,可以自己来实现。
作者: hk92    时间: 2016-1-5 15:25
佰锐科技-邵光清 发表于 2016-1-5 15:23
您好,一路视频源多路显示,我们没有这个demo,可以自己来实现。

您好,可以给一点思路吗?
作者: 佰锐科技-李永星    时间: 2016-1-5 15:59
hk92 发表于 2016-1-5 15:25
您好,可以给一点思路吗?

您好,你可以参考如下代码:
  1. /**
  2. *        视频数据扩展回调(增加时间戳)
  3. *        @param dwUserid 用户ID号
  4. *        @param lpBuf 视频数据缓冲区
  5. *        @param dwLen 缓冲区大小
  6. *        @param bmiHeader 视频缓冲区的头信息,包含了视频的大小、颜色位数等信息
  7. *        @param dwTimeStamp 时间戳
  8. */
  9. void CALLBACK OnAnyChatVideoDataExCallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader, DWORD dwTimeStamp, LPVOID lpUserValue)
  10. {
  11.         TRACE("VideoDataExCallBack: userid:%d, timestamp:%d\r\n", (int)dwUserid, dwTimeStamp);
  12.         CAnyChatInputVideoDlg* lpDlg = (CAnyChatInputVideoDlg*)lpUserValue;
  13.         CRect dispRect;
  14.         HWND hWnd;
  15.         if(lpDlg->m_dwRemoteUserId == dwUserid && dwUserid != -1)                                        // 远程用户
  16.         {
  17.                 hWnd = lpDlg->GetDlgItem(IDC_STATIC_REMOTEVIDEO)->GetSafeHwnd();
  18.                 lpDlg->GetDlgItem(IDC_STATIC_REMOTEVIDEO)->GetClientRect(dispRect);
  19.         }
  20.         else                                                                                                                                // 本地用户
  21.         {
  22.                 hWnd = lpDlg->GetDlgItem(IDC_STATIC_LOCALVIDEO)->GetSafeHwnd();
  23.                 lpDlg->GetDlgItem(IDC_STATIC_LOCALVIDEO)->GetClientRect(dispRect);
  24.         }
  25.        
  26.         //构建Bitmap  
  27.         BITMAPINFOHEADER  *lpbmi = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)+dwLen);  
  28.         ZeroMemory(lpbmi,sizeof(BITMAPINFOHEADER)+dwLen);
  29.     memcpy((LPBYTE)lpbmi,&bmiHeader,sizeof(BITMAPINFOHEADER));
  30.         memcpy(((LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)),lpBuf,dwLen);  
  31.        
  32.         HDC hdc = ::GetDC(hWnd);
  33.         HDC dcMem = ::CreateCompatibleDC(hdc);  
  34.         HBITMAP hBitmap = CreateDIBitmap(hdc,lpbmi,CBM_INIT,(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER),(LPBITMAPINFO)lpbmi,DIB_RGB_COLORS);  
  35.         //绘图  
  36.         HBITMAP holdbm = (HBITMAP)SelectObject(dcMem,hBitmap);  
  37.         ::SetStretchBltMode(hdc,COLORONCOLOR);
  38.         ::StretchBlt(hdc,dispRect.left,dispRect.top,dispRect.Width(),dispRect.Height(),dcMem,0,0,bmiHeader.biWidth,bmiHeader.biHeight,SRCCOPY);
  39.        
  40.         SelectObject(dcMem,holdbm);  
  41.         ::DeleteDC(dcMem);
  42.         ::DeleteObject(hBitmap);
  43.         ::ReleaseDC(hWnd,hdc);
  44.         free(lpbmi);
  45.         lpbmi = NULL;
  46. }
复制代码





欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/) Powered by Discuz! X3