锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Links: http://sw2us.com/sites/default/files/dvr.demo.v0.1.0_2012.3.27.zip
騫稿ソ鏈変簡(jiǎn)python榪欎釜濂藉府鎵?涓嶇劧瑕佸共姝諱簡(jiǎn)錛宲ython瀵規(guī)垜鏉ヨ涓嶆槸綆鍗曠殑褰撹兌姘磋緟鍔╀簡(jiǎn)錛岄氫俊妗嗘灦銆乁I銆佹暟鎹簱閮介噰鐢╬ython錛屽彧鏈夐偅浜涗釜鐐逛笂鐢ㄤ簡(jiǎn)楂樻晥鐐圭殑c++錛屼緥濡傦細(xì)ffmpeg瑙g爜銆佹枃浠跺瓨鍌ㄧ瓑絳?br />婕旂ず瑙嗛:
緋葷粺榪愯demo:
]]>
鍏跺疄鐜版妧鏈細(xì)
win-hook + event-simulate + gdi-bitmap-capture(delay send) + libjpeg + socket
鐮旂┒瀹屼簡(jiǎn)鍏跺伐浣滄満鍒朵箣鍚庢垜涔熷啓浜?jiǎn)涓涓被vnc鐨勬湇鍔″櫒鍜屽鎴風(fēng)紼嬪簭錛岃繍琛屼箣鍚庡彂鐜板湪棰戠巼寰堥珮鐨刡itmap鎹曡幏鍒發(fā)ibjpeg鐨勫帇緙╃殑榪囩▼寰堣梒pu璧勬簮錛岃繕鏈夊氨鏄櫧鐒墮噰鐢╦peg鍘嬬緝(濡傚湪鍋氳棰戠洃鎺ф椂閲囩敤鐨刴jpeg璁懼涓鏍?榪樻槸浜庣爜嫻佸お澶э紝璺焩nc姣旇緝浜?jiǎn)浠ヤ笅濂藉儚杩樻槸鏈変竴鐐圭殑宸窛錛屾瘯绔熶笉鏄綋浣滀竴涓寮忕殑鍜氬挌鍘誨仛鐨勶紝絳夋湁鏃墮棿涔嬪悗鎴栬呮煇浜哄¤涔嬩笅緇х畫瀹屽杽瀹冨惂錛?img src ="http://www.shnenglu.com/socketref/aggbug/3624.html" width = "1" height = "1" />
]]>
2
3 #include "jpeglib.h"
4
5 void
6 JpegInitDestination(j_compress_ptr cinfo)
7 {
8 }
9
10 static boolean
11 JpegEmptyOutputBuffer(j_compress_ptr cinfo)
12 {
13 return TRUE;
14 }
15
16 static void
17 JpegTermDestination(j_compress_ptr cinfo)
18 {
19 // jpegDstDataLen = jpegDstBufferLen - jpegDstManager.free_in_buffer;
20 }
21
22 /**
23 Raw Rgb Data converted to Jpeg data
24 */
25 bool JpegCompress(int w,int h,const char * rgb_data,int rgb_size,
26 char * jpeg_data,int *jpeg_size){
27 struct jpeg_compress_struct cinfo;
28 struct jpeg_error_mgr jerr;
29 struct jpeg_destination_mgr jpegDstManager;
30 int ret;
31 unsigned char *srcBuf = new unsigned char[w * 3];
32 JSAMPROW rowPointer[1];
33 rowPointer[0] = (JSAMPROW)srcBuf;
34 int left_size;
35 left_size = *jpeg_size;
36 cinfo.err = jpeg_std_error(&jerr);
37 jpeg_create_compress(&cinfo);
38
39 cinfo.image_width = w;
40 cinfo.image_height = h;
41 cinfo.input_components = 3;
42 cinfo.in_color_space = JCS_RGB;
43 cinfo.raw_data_in = true;
44 jpeg_set_defaults(&cinfo);
45
46
47 cinfo.dest = &jpegDstManager;
48
49 jpegDstManager.next_output_byte = (unsigned char*)jpeg_data;
50 jpegDstManager.free_in_buffer = left_size;
51 jpegDstManager.init_destination = JpegInitDestination;
52 jpegDstManager.empty_output_buffer = JpegEmptyOutputBuffer;
53 jpegDstManager.term_destination = JpegTermDestination;
54
55 //jpeg_set_quality(&cinfo, 20, TRUE);
56
57 jpeg_start_compress(&cinfo, TRUE);
58 for(int y=0;y< h;y++){
59 rowPointer[0] = (unsigned char*)(rgb_data + y*w*3);
60 ret = jpeg_write_scanlines(&cinfo, rowPointer, 1);
61 }
62 jpeg_finish_compress(&cinfo);
63 jpeg_destroy_compress(&cinfo);
64 *jpeg_size = left_size - jpegDstManager.free_in_buffer;
65 return true;
66 }
67
68 void
69 JpegInitSource(j_decompress_ptr cinfo)
70 {
71
72 }
73
74 boolean
75 JpegFillInputBuffer(j_decompress_ptr cinfo)
76 {
77 /*
78 jpegError = true;
79 jpegSrcManager.bytes_in_buffer = jpegBufferLen;
80 jpegSrcManager.next_input_byte = (JOCTET *)jpegBufferPtr; */
81 return TRUE;
82 }
83
84 void
85 JpegSkipInputData(j_decompress_ptr cinfo, long num_bytes)
86 {/*
87 if (num_bytes < 0 || (size_t)num_bytes > jpegSrcManager.bytes_in_buffer) {
88 jpegError = true;
89 jpegSrcManager.bytes_in_buffer = jpegBufferLen;
90 jpegSrcManager.next_input_byte = (JOCTET *)jpegBufferPtr;
91 } else {
92 jpegSrcManager.next_input_byte += (size_t) num_bytes;
93 jpegSrcManager.bytes_in_buffer -= (size_t) num_bytes;
94 }*/
95 }
96
97 void
98 JpegTermSource(j_decompress_ptr cinfo)
99 {
100 /* No work necessary here. */
101 }
102
103 bool JpegUnCompress(const char * jpeg_data,int jpeg_size,
104 char *rgb_data,int rgb_size,int w,int h){
105 struct jpeg_decompress_struct cinfo;
106 struct jpeg_error_mgr jerr;
107 struct jpeg_source_mgr jpegSrcManager;
108 int ret;
109 JSAMPROW rowPointer[1];
110 cinfo.err = jpeg_std_error(&jerr);
111 jpeg_create_decompress(&cinfo);
112
113 jpegSrcManager.init_source = JpegInitSource;
114 jpegSrcManager.fill_input_buffer = JpegFillInputBuffer;
115 jpegSrcManager.skip_input_data = JpegSkipInputData;
116 jpegSrcManager.resync_to_restart = jpeg_resync_to_restart;
117 jpegSrcManager.term_source = JpegTermSource;
118 jpegSrcManager.next_input_byte = (unsigned char*)jpeg_data;
119 jpegSrcManager.bytes_in_buffer = jpeg_size;
120 cinfo.src = &jpegSrcManager;
121
122 jpeg_read_header(&cinfo, TRUE);
123 cinfo.out_color_space = JCS_RGB;
124 jpeg_start_decompress(&cinfo);
125 if( cinfo.output_width != (unsigned int)w && cinfo.output_height != (unsigned int)h){
126 jpeg_destroy_decompress(&cinfo);
127 return false;
128 }
129 for (int dy = 0; cinfo.output_scanline < cinfo.output_height; dy++) {
130 rowPointer[0] = (unsigned char *)(rgb_data + w*dy*3);
131 ret = jpeg_read_scanlines(&cinfo, rowPointer, 1);
132 }
133 jpeg_finish_decompress(&cinfo);
134 jpeg_destroy_decompress(&cinfo);
135 return true;
136 }
137
]]>
]]>
2 /*
3
4 capture.h
5 caputre鐢ㄦ埛鎹曡幏pc camera鐨?nbsp;RGB瑙嗛婧?BR> 6 鍋氬埌capture,encoder,mgr 鐙珛錛屼笉浼?xì)鏈変緷璧栨э紝浠ヤ究涔嬪悗鐨勫鐢?BR> 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
2 #include "capture.h"
3
4 /*
5 瑙嗛鎹曡幏錛屽繀欏繪彁渚涙秷鎭鐞嗘満鍒?
6 while(GetMessage()){
7 TranslateMessage();
8 DispatchMessage();
9 }
10 鑰屼笖鍥炶皟鍑芥暟蹇呴』澹版槑涓?nbsp;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 0, 0, 200,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
]]>
]]>
]]>
鏀寔璇█: C++ / Python
璁″垝鏃墮棿: 2005.12.31 ~ 2006.1.3
2006.1.4 瀹屾垚rpcServer c++鐗堟湰