socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

利用windows capture Api捕获的视频流是RGB数据
 1 
 2 /*
 3 
 4     capture.h
 5     caputre用户捕获pc camera的 RGB视频源
 6     做到capture,encoder,mgr 独立,不会有依赖性,以便之后的复用
 7 */
 8 
 9 #ifndef _DESKCAM_CAPTURE_H
10 #define _DESKCAM_CAPTURE_H
11 
12 
13 #include <windows.h>
14 #include "vfw.h"
15 #pragma comment(lib, "winmm.lib")
16 #pragma comment(lib, "vfw32.lib")
17 #include <nv.h>
18 
19 
20 struct CaptureInfo{
21     NVString        sid;
22     unsigned int    index;    //
23     unsigned int    type;    //类别
24     unsigned short    width;
25     unsigned short  height;    
26     void (*after_capture)(void * data,unsigned int size,void * user);
27     void * user;
28 };
29 
30 class  PCDeskCamera:public NVObject{
31 public:
32     PCDeskCamera(){ _bmpInfo = NULL;}
33     ~PCDeskCamera(){    if(_bmpInfo)    {delete _bmpInfo;_bmpInfo=NULL;} }
34 
35     bool                Open();
36     void                Close();
37     CaptureInfo&        GetCaptureInfo(){    return _ctx;}
38 private:    
39     static LRESULT    CALLBACK    StreamCapture(HWND hwnd,LPVIDEOHDR hdr);
40     bool                GetBitmapInfo(HWND cap);
41     HWND                _hwnd;
42     CaptureInfo            _ctx;
43     HWND                _capture_wnd;
44     LPBITMAPINFO        _bmpInfo;        
45 };
46 #endif
47 
 1 
 2 #include "capture.h"
 3 
 4 /*
 5 视频捕获,必须提供消息处理机制:    
 6 while(GetMessage()){
 7     TranslateMessage();
 8     DispatchMessage();
 9 }
10 而且回调函数必须声明为 static LRESULT    CALLBACK,否则产生异常
11 */
12 
13 LRESULT PCDeskCamera::StreamCapture(HWND hwnd,LPVIDEOHDR hdr){
14     PCDeskCamera * cam;    
15     //int i;
16     //i=100;
17 //    MessageBeep(100);
18 //    return 0;
19     
20     cam = (PCDeskCamera*)GetWindowLong(hwnd,GWL_USERDATA);
21     if( cam== NULL){        
22         return 0;
23     }    
24     //--     
25     cam->GetCaptureInfo().after_capture(hdr->lpData,hdr->dwBytesUsed,
26         cam->GetCaptureInfo().user);
27     return 1;
28 }
29  
30 
31 bool PCDeskCamera::GetBitmapInfo(HWND cap){
32     int vfs=capGetVideoFormatSize(cap);    
33     if(!vfs)        return false;    
34     if(_bmpInfo)    {delete _bmpInfo;_bmpInfo=NULL;}
35     _bmpInfo =(BITMAPINFO*)( new char[vfs]);    
36     LPBITMAPINFOHEADER bmpIH=( LPBITMAPINFOHEADER )_bmpInfo;    
37     bmpIH->biSize= sizeof(BITMAPINFOHEADER);
38     BOOL ret=capGetVideoFormat(cap, _bmpInfo, (WORD)vfs);    
39     _ctx.width = bmpIH->biWidth;
40     _ctx.height = bmpIH->biHeight;
41     return true;
42 }
43 
44 bool PCDeskCamera::Open(){
45     int ret;
46     CAPTUREPARMS cpp;        
47     _capture_wnd = capCreateCaptureWindow("AviCap_Basic1", WS_CHILD|WS_VISIBLE, 
48         00200,200,
49         GetDesktopWindow(),
50         0xff00);    
51     if(_capture_wnd == NULL){
52         return false;
53     }
54     SetWindowLong(_capture_wnd,GWL_USERDATA,(LONG)this);
55     capPreviewRate(_capture_wnd,50);
56     ret =capDriverConnect(_capture_wnd, _ctx.index);
57     if( ret == FALSE){
58         return false;
59     }
60 
61     if(!GetBitmapInfo(_capture_wnd))    {
62         return false;
63     }    
64     ret = capSetCallbackOnVideoStream(_capture_wnd,PCDeskCamera::StreamCapture);
65     capCaptureGetSetup(_capture_wnd, &cpp, sizeof(CAPTUREPARMS));
66        cpp.fYield = true ;
67     cpp.fAbortLeftMouse = false;
68     cpp.fAbortRightMouse = false;
69     cpp.fCaptureAudio = false;
70     ret = capCaptureSetSetup (_capture_wnd, &cpp, sizeof(CAPTUREPARMS));
71     capCaptureSequenceNoFile(_capture_wnd);
72     //capCaptureSequence(_capture_wnd);
73     ShowWindow(_capture_wnd,SW_HIDE);    
74 
75 
76     return true;
77 }
78 
79 void PCDeskCamera::Close(){
80 //    capCaptureAbort(_capture_wnd);    
81     capSetCallbackOnVideoStream(0 ,NULL);
82     capDriverDisconnect(_capture_wnd);    
83     capCaptureStop(_capture_wnd);
84     SetWindowLong(_capture_wnd,GWL_USERDATA,(LONG)NULL);
85     ::CloseWindow(_capture_wnd);
86     DestroyWindow(_capture_wnd);    
87 }
88 
89 
90 
posted on 2006-03-02 00:36 放屁阿狗 阅读(1187) 评论(0)  编辑 收藏 引用 所属分类: 视频监控

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理