完整的DirectShow捕获音视频的demo(源码)

来源:互联网 发布:数据库设计三大原则 编辑:程序博客网 时间:2024/04/30 14:36

转至:http://blog.csdn.net/wangqiulin123456/article/details/8675915


      

近段时间由于工作上的需要,大概看了下DirectShow,写了个小的demo,方便理解。以后在深入的学习下DirectShow。贴出代码。

对音频所做的处理如下图:



1. common.h文件

[cpp] view plaincopyprint?
  1. #ifndef __COMMON_H__  
  2. #define __COMMON_H__  
  3.   
  4. #include <DShow.h>  
  5. #include "qedit.h"  
  6. #include <strsafe.h>  
  7. #include <assert.h>  
  8. #pragma comment(lib,"Strmiids.lib")  
  9.   
  10. //define release maco  
  11. #define ReleaseInterface(x) \  
  12.     if ( NULL != x ) \  
  13. { \  
  14.     x->Release( ); \  
  15.     x = NULL; \  
  16. }  
  17. // Application-defined message to notify app of filter graph events  
  18. #define WM_GRAPHNOTIFY  WM_APP+100  
  19.   
  20. void Msg(HWND hwnd,TCHAR *szFormat, ...);  
  21. bool Bstr_Compare(BSTR bstrFilter,BSTR bstrDevice);  
  22.   
  23. #endif// __COMMON_H__  

实现:

[cpp] view plaincopyprint?
  1. #include "common.h"  
  2.   
  3. void Msg(HWND hwnd,TCHAR *szFormat, ...)  
  4. {  
  5.     TCHAR szBuffer[1024];    
  6.     const size_t NUMCHARS = sizeof(szBuffer) / sizeof(szBuffer[0]);  
  7.     const int LASTCHAR = NUMCHARS - 1;  
  8.   
  9.     va_list pArgs;  
  10.     va_start(pArgs, szFormat);  
  11.   
  12.     (void)StringCchVPrintf(szBuffer, NUMCHARS - 1, szFormat, pArgs);  
  13.     va_end(pArgs);  
  14.   
  15.     szBuffer[LASTCHAR] = TEXT('\0');  
  16.   
  17.     MessageBox(hwnd, szBuffer, TEXT("Message"), MB_OK | MB_ICONERROR);  
  18. }  
  19.   
  20. bool Bstr_Compare(BSTR bstrFilter,BSTR bstrDevice)  
  21. {  
  22.     bool flag = true;  
  23.     int strlenFilter = SysStringLen(bstrFilter);  
  24.     int strlenDevice = SysStringLen(bstrDevice);  
  25.     char* chrFilter = (char*)malloc(strlenFilter+1);  
  26.     char* chrDevice = (char*)malloc(strlenDevice+1);  
  27.     int j = 0;  
  28.   
  29.     if (strlenFilter!=strlenDevice)  
  30.         flag = false;  
  31.     else  
  32.     {  
  33.         for(; j < strlenFilter;j++)  
  34.         {  
  35.             chrFilter[j] = (char)bstrFilter[j];  
  36.             chrDevice[j] = (char)bstrDevice[j];  
  37.   
  38.         }  
  39.         chrFilter[strlenFilter] = '\0';  
  40.         chrDevice[strlenDevice] = '\0';  
  41.   
  42.         for(j=0; j < strlenFilter;j++)  
  43.         {  
  44.             if(chrFilter[j] != chrDevice[j])  
  45.                 flag = false;  
  46.         }  
  47.   
  48.         if(flag == true && j == strlenFilter-1)  
  49.             flag = true;  
  50.     }  
  51.     return flag;  
  52. }  


2.SampleGrabberCallback.h文件,由于截取视频图片,回调函数的实现

[cpp] view plaincopyprint?
  1. #ifndef __SAMPLEGRABBERCALLBACK_H__  
  2. #define __SAMPLEGRABBERCALLBACK_H__  
  3. #include "common.h"  
  4.   
  5. class SampleGrabberCallback : public ISampleGrabberCB  
  6. {  
  7. public:  
  8.     ULONG STDMETHODCALLTYPE AddRef();  
  9.     ULONG STDMETHODCALLTYPE Release();  
  10.     HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,void** ppvObject);  
  11.   
  12.     HRESULT STDMETHODCALLTYPE SampleCB(double Time, IMediaSample *pSample);  
  13.     HRESULT STDMETHODCALLTYPE BufferCB(double Time, BYTE *pBuffer, long BufferLen);  
  14.       
  15.     SampleGrabberCallback();  
  16.     BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize ); //保存bitmap图片  
  17. public:  
  18.     BOOL m_bGetPicture;  // is get a picture  
  19.     long m_lWidth;       //存储图片的宽度  
  20.     long m_lHeight;      //存储图片的长度  
  21.     int  m_iBitCount;    //the number of bits per pixel (bpp)  
  22.     TCHAR m_chTempPath[MAX_PATH];  
  23.     TCHAR m_chSwapStr[MAX_PATH];  
  24.     TCHAR m_chDirName[MAX_PATH];  
  25. };  
  26.   
  27. #endif //__SAMPLEGRABBERCALLBACK_H__  

实现:

[cpp] view plaincopyprint?
  1. #include "SampleGrabberCallback.h"  
  2.   
  3.   
  4.   
  5. SampleGrabberCallback::SampleGrabberCallback()  
  6. {  
  7.     m_bGetPicture = FALSE;  
  8.     //Get template path  
  9.     GetTempPath(MAX_PATH,m_chTempPath);  
  10.     StringCchCat(m_chTempPath,MAX_PATH,TEXT("NTKOCapturePic"));  
  11.     CreateDirectory(m_chTempPath,NULL);  
  12. }  
  13.   
  14. ULONG STDMETHODCALLTYPE SampleGrabberCallback::AddRef()  
  15. {  
  16.     return 1;  
  17. }  
  18.   
  19. ULONG STDMETHODCALLTYPE SampleGrabberCallback::Release()  
  20. {  
  21.     return 2;  
  22. }  
  23.   
  24. HRESULT STDMETHODCALLTYPE SampleGrabberCallback::QueryInterface(REFIID riid,void** ppvObject)  
  25. {  
  26.     if (NULL == ppvObject) return E_POINTER;  
  27.     if (riid == __uuidof(IUnknown))  
  28.     {  
  29.         *ppvObject = static_cast<IUnknown*>(this);  
  30.         return S_OK;  
  31.     }  
  32.     if (riid == IID_ISampleGrabberCB)  
  33.     {  
  34.         *ppvObject = static_cast<ISampleGrabberCB*>(this);  
  35.         return S_OK;  
  36.     }  
  37.     return E_NOTIMPL;  
  38.   
  39. }  
  40.   
  41. HRESULT STDMETHODCALLTYPE SampleGrabberCallback::SampleCB(double Time, IMediaSample *pSample)  
  42. {  
  43.     return E_NOTIMPL;  
  44. }  
  45.   
  46. HRESULT STDMETHODCALLTYPE SampleGrabberCallback::BufferCB(double Time, BYTE *pBuffer, long BufferLen)  
  47. {  
  48.     if(FALSE == m_bGetPicture)  //判断是否需要截图  
  49.         return S_FALSE;  
  50.     if(!pBuffer)  
  51.         return E_POINTER;  
  52.   
  53.     SaveBitmap(pBuffer,BufferLen);  
  54.   
  55.     m_bGetPicture = FALSE;  
  56.     return S_OK;  
  57. }  
  58.   
  59. BOOL SampleGrabberCallback::SaveBitmap(BYTE * pBuffer, long lBufferSize )  
  60. {  
  61.     SYSTEMTIME sysTime;  
  62.     GetLocalTime(&sysTime);  
  63.     StringCchCopy(m_chSwapStr,MAX_PATH,m_chTempPath);  
  64.     StringCchPrintf(m_chDirName,MAX_PATH,TEXT("\\%04i%02i%02i%02i%02i%02i%03ione.bmp"),  
  65.                     sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,  
  66.                     sysTime.wMinute,sysTime.wSecond,sysTime.wMilliseconds);  
  67.     StringCchCat(m_chSwapStr,MAX_PATH,m_chDirName);  
  68.     //MessageBox(NULL,chTempPath,TEXT("Message"),MB_OK);  
  69.     //create picture file  
  70.     HANDLE hf = CreateFile(m_chSwapStr,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,  
  71.         CREATE_ALWAYS,0,NULL);  
  72.     if(hf == INVALID_HANDLE_VALUE)  
  73.     {  
  74.         return E_FAIL;  
  75.     }  
  76.   
  77.     BITMAPFILEHEADER bfh;  //Set bitmap header  
  78.     ZeroMemory(&bfh,sizeof(bfh));  
  79.     bfh.bfType = 'MB';  
  80.     bfh.bfSize = sizeof(bfh) + lBufferSize + sizeof(BITMAPFILEHEADER);  
  81.     bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPFILEHEADER);  
  82.     // Write the file header.  
  83.     DWORD dwWritten = 0;  
  84.     WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );      
  85.     // Write the file Format  
  86.     BITMAPINFOHEADER bih;  
  87.     ZeroMemory(&bih,sizeof(bih));  
  88.     bih.biSize = sizeof( bih );  
  89.     bih.biWidth = m_lWidth;  
  90.     bih.biHeight = m_lHeight;  
  91.     bih.biPlanes = 1;  
  92.     bih.biBitCount = m_iBitCount;  //Specifies the number of bits per pixel (bpp)  
  93.     WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );  
  94.     //Write the file Data  
  95.     WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );  
  96.     CloseHandle( hf );  
  97.     return 0;  
  98. }  

3.CaptureVideo.h 捕获视频,预览和截图文件

[cpp] view plaincopyprint?
  1. #ifndef __CAPTUREVIDEO_H__  
  2. #define __CAPTUREVIDEO_H__  
  3. #include "SampleGrabberCallback.h"  
  4.   
  5. class CaptureVideo  
  6. {  
  7. public:  
  8.     CaptureVideo();  
  9.     ~CaptureVideo();  
  10.     HRESULT InitializeEnv(); //initialize environment  
  11.     HRESULT EnumAllDevices(HWND hCombox);  //Enumeration all devices  
  12.     void CloseInterface(); //close all interface  
  13.     HRESULT OpenDevice(int deviceID, LONG nLeft, LONG nTop, LONG nWide, LONG nHeight);  
  14.     HRESULT BindFilter(int deviceID, IBaseFilter **pBaseFilter);  
  15.     HRESULT SetupVideoWindow(LONG nLeft, LONG nTop, LONG nWidth, LONG nHeight);  
  16.     void ResizeVideoWindow(LONG nLeft, LONG nTop, LONG nWidth, LONG nHeight);  
  17.     void GrabOneFrame(BOOL bGrab); // use ISampleGrabberCallbackCB get a picture  
  18.     HRESULT HandleGraphCapturePicture(void); //capture picture  use GetCurrentBuffer  
  19.   
  20. private:  
  21.     IGraphBuilder *m_pGraphBuilder;  
  22.     ICaptureGraphBuilder2 *m_pCaptureGB;  
  23.     IMediaControl *m_pMediaControl;  
  24.     IBaseFilter *m_pDevFilter;  
  25.     ISampleGrabber *m_pSampGrabber;    
  26.     IMediaEventEx *m_pMediaEvent;  
  27. public:  
  28.     int m_nCaptureDeviceNumber;      //Device Count  
  29.     //vector<string> m_vecCapDeviceName; //the Device name  
  30.     TCHAR m_pCapDeviceName[10][MAX_PATH]; //the Device name  
  31.     HWND m_App;  
  32.     BOOL m_bGetOneShot;  
  33.     BOOL m_bConnect;  
  34.     IVideoWindow *m_pVideoWindow;  
  35. };  
  36.   
  37.   
  38. #endif  //__CAPTUREVIDEO_H__  

实现:

[cpp] view plaincopyprint?
  1. #include "CaptureVideo.h"  
  2.   
  3. SampleGrabberCallback g_sampleGrabberCB;  //CallBack  
  4.   
  5. CaptureVideo::CaptureVideo()  
  6. {  
  7.     //COM Library Initialize  
  8.     if (FAILED(CoInitialize(NULL)))  
  9.     {  
  10.         Msg(m_App,TEXT("CoInitialize Failed!\r\n"));  
  11.         return;  
  12.     }  
  13.     //initialize member variable  
  14.     m_nCaptureDeviceNumber = 0;  
  15.     m_pDevFilter = NULL;  
  16.     m_pCaptureGB = NULL;  
  17.     m_pGraphBuilder = NULL;  
  18.     m_pMediaControl = NULL;  
  19.     m_pMediaEvent = NULL;  
  20.     m_pSampGrabber = NULL;  
  21.     m_pVideoWindow = NULL;  
  22.     m_App = NULL;  
  23.     m_bGetOneShot = FALSE;  
  24.     m_bConnect = FALSE;  
  25.     InitializeEnv();  
  26. }  
  27.   
  28. CaptureVideo::~CaptureVideo()  
  29. {  
  30.     CloseInterface();  
  31.     CoUninitialize();  
  32. }  
  33.   
  34. HRESULT CaptureVideo::EnumAllDevices(HWND hCombox)  
  35. {  
  36.     if (!hCombox)  
  37.         return S_FALSE;  
  38.     ICreateDevEnum *pDevEnum;  
  39.     IEnumMoniker   *pEnumMon;  
  40.     IMoniker       *pMoniker;  
  41.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,  
  42.             IID_ICreateDevEnum,(LPVOID*)&pDevEnum);  
  43.     if (SUCCEEDED(hr))  
  44.     {  
  45.         hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnumMon, 0);  
  46.         if (hr == S_FALSE)  
  47.         {  
  48.             hr = VFW_E_NOT_FOUND;  
  49.             return hr;  
  50.         }  
  51.         pEnumMon->Reset();  
  52.         ULONG cFetched;  
  53.         while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)  
  54.         {  
  55.             IPropertyBag *pProBag;  
  56.             hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);  
  57.             if (SUCCEEDED(hr))  
  58.             {  
  59.                 VARIANT varTemp;  
  60.                 varTemp.vt = VT_BSTR;  
  61.                 hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);  
  62.                 if (SUCCEEDED(hr))  
  63.                 {  
  64.                     //int nStrSize = WideCharToMultiByte(CP_ACP,0,varTemp.bstrVal,-1,0,0,NULL,FALSE);  
  65.                     //char *strName = new char[nStrSize];  
  66.                     //WideCharToMultiByte(CP_ACP,0,varTemp.bstrVal,-1,strName,nStrSize,NULL,FALSE);  
  67.                     //m_vecCapDeviceName.push_back(string(strName)); //push the device name to vector  
  68.                       
  69.                     StringCchCopy(m_pCapDeviceName[m_nCaptureDeviceNumber],MAX_PATH,varTemp.bstrVal);  
  70.                     m_nCaptureDeviceNumber++; //Device number add 1  
  71.                     ::SendMessage(hCombox, CB_ADDSTRING, 0,(LPARAM)varTemp.bstrVal);  
  72.                     SysFreeString(varTemp.bstrVal);  
  73.                 }  
  74.                 pProBag->Release();  
  75.             }  
  76.             pMoniker->Release();  
  77.         }  
  78.         pEnumMon->Release();  
  79.     }  
  80.     return hr;  
  81. }  
  82.   
  83. HRESULT CaptureVideo::InitializeEnv()  
  84. {  
  85.     HRESULT hr;  
  86.   
  87.     //Create the filter graph  
  88.     hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,  
  89.                           IID_IGraphBuilder,(LPVOID*)&m_pGraphBuilder);  
  90.     if(FAILED(hr))  
  91.         return hr;  
  92.       
  93.     //Create the capture graph builder  
  94.     hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,  
  95.                           IID_ICaptureGraphBuilder2,(LPVOID*)&m_pCaptureGB);  
  96.     if(FAILED(hr))  
  97.         return hr;  
  98.   
  99.     //Obtain interfaces for media control and Video Window  
  100.     hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&m_pMediaControl);  
  101.     if(FAILED(hr))  
  102.         return hr;  
  103.   
  104.     hr = m_pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&m_pVideoWindow);  
  105.     if(FAILED(hr))  
  106.         return hr;  
  107.   
  108.     hr = m_pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&m_pMediaEvent);  
  109.     if(FAILED(hr))  
  110.         return hr;  
  111.   
  112.     hr = m_pMediaEvent->SetNotifyWindow((OAHWND)m_App,WM_GRAPHNOTIFY,0);  
  113.   
  114.     if(FAILED(hr))  
  115.         return hr;  
  116.     m_pCaptureGB->SetFiltergraph(m_pGraphBuilder);  
  117.     if(FAILED(hr))  
  118.         return hr;  
  119.     return hr;  
  120. }  
  121.   
  122. void CaptureVideo::CloseInterface()  
  123. {  
  124.     m_bGetOneShot = FALSE;  
  125.   
  126.     if (m_pMediaControl)  
  127.         m_pMediaControl->Stop();  
  128.     if(m_pVideoWindow)  
  129.     {  
  130.         m_pVideoWindow->get_Visible(FALSE);  
  131.         m_pVideoWindow->put_Owner(NULL);  
  132.     }  
  133.   
  134.     if(m_pMediaEvent)  
  135.         m_pMediaEvent->SetNotifyWindow(NULL,WM_GRAPHNOTIFY,0);  
  136.   
  137.     //release interface  
  138.     ReleaseInterface(m_pDevFilter);  
  139.     ReleaseInterface(m_pCaptureGB);  
  140.     ReleaseInterface(m_pGraphBuilder);  
  141.     ReleaseInterface(m_pMediaControl);  
  142.     ReleaseInterface(m_pMediaEvent);  
  143.     ReleaseInterface(m_pSampGrabber);  
  144.     ReleaseInterface(m_pVideoWindow);  
  145. }  
  146.   
  147. HRESULT CaptureVideo::BindFilter(int deviceID, IBaseFilter **pBaseFilter)  
  148. {  
  149.     ICreateDevEnum *pDevEnum;  
  150.     IEnumMoniker   *pEnumMon;  
  151.     IMoniker       *pMoniker;  
  152.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,  
  153.         IID_ICreateDevEnum,(LPVOID*)&pDevEnum);  
  154.     if (SUCCEEDED(hr))  
  155.     {  
  156.         hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnumMon, 0);  
  157.         if (hr == S_FALSE)  
  158.         {  
  159.             hr = VFW_E_NOT_FOUND;  
  160.             return hr;  
  161.         }  
  162.         pEnumMon->Reset();  
  163.         ULONG cFetched;  
  164.         int index = 0;  
  165.         while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK, index<= deviceID)  
  166.         {  
  167.             IPropertyBag *pProBag;  
  168.             hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);  
  169.             if (SUCCEEDED(hr))  
  170.             {  
  171.                 if (index == deviceID)  
  172.                 {  
  173.                     pMoniker->BindToObject(0,0,IID_IBaseFilter,(LPVOID*)pBaseFilter);  
  174.                 }  
  175.             }  
  176.             pMoniker->Release();  
  177.             index++;  
  178.         }  
  179.         pEnumMon->Release();  
  180.     }  
  181.     return hr;  
  182. }  
  183.   
  184. HRESULT CaptureVideo::SetupVideoWindow(LONG nLeft, LONG nTop, LONG nWidth, LONG nHeight)  
  185. {  
  186.     HRESULT hr;  
  187.     hr = m_pVideoWindow->put_Owner((OAHWND)m_App);  
  188.     if (FAILED(hr))  
  189.         return hr;  
  190.   
  191.     hr = m_pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);  
  192.     if(FAILED(hr))  
  193.         return hr;  
  194.   
  195.     ResizeVideoWindow(nLeft,nTop,nWidth,nHeight);  
  196.   
  197.     hr = m_pVideoWindow->put_Visible(OATRUE);  
  198.     if(FAILED(hr))  
  199.         return hr;  
  200.   
  201.     return hr;  
  202. }  
  203.   
  204. void CaptureVideo::ResizeVideoWindow(LONG nLeft, LONG nTop, LONG nWidth, LONG nHeight)  
  205. {  
  206.     if(m_pVideoWindow)  
  207.     {  
  208.         m_pVideoWindow->SetWindowPosition(nLeft,nTop,nWidth,nHeight);  
  209.     }  
  210. }  
  211.   
  212. HRESULT CaptureVideo::OpenDevice(int deviceID, LONG nLeft, LONG nTop, LONG nWide, LONG nHeight)  
  213. {  
  214.     HRESULT hr;  
  215.     IBaseFilter *pSampleGrabberFilter;  
  216.     if (m_bConnect)  
  217.     {  
  218.         CloseInterface();  
  219.         InitializeEnv();  
  220.     }  
  221.   
  222.     hr = CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,  
  223.                           IID_IBaseFilter, (LPVOID*)&pSampleGrabberFilter);  
  224.     if(FAILED(hr))  
  225.         return hr;  
  226.     //bind device filter  
  227.     hr = BindFilter(deviceID,&m_pDevFilter);  
  228.     if (FAILED(hr))  
  229.         return hr;  
  230.     hr = m_pGraphBuilder->AddFilter(m_pDevFilter,L"Video Filter");  
  231.     if (FAILED(hr))  
  232.         return hr;  
  233.   
  234.     hr = m_pGraphBuilder->AddFilter(pSampleGrabberFilter,L"Sample Grabber");  
  235.     if (FAILED(hr))  
  236.         return hr;  
  237.   
  238.     hr = pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber,(LPVOID*)&m_pSampGrabber);  
  239.     if(FAILED(hr))  
  240.         return hr;  
  241.   
  242.     //set media type  
  243.     AM_MEDIA_TYPE mediaType;  
  244.     ZeroMemory(&mediaType,sizeof(AM_MEDIA_TYPE));  
  245.     //Find the current bit depth  
  246.     HDC hdc=GetDC(NULL);  
  247.     int iBitDepth=GetDeviceCaps(hdc, BITSPIXEL);  
  248.     g_sampleGrabberCB.m_iBitCount = iBitDepth;  
  249.     ReleaseDC(NULL,hdc);  
  250.     //Set the media type  
  251.     mediaType.majortype = MEDIATYPE_Video;  
  252.     switch(iBitDepth)  
  253.     {  
  254.     case  8:  
  255.         mediaType.subtype=MEDIASUBTYPE_RGB8;  
  256.         break;  
  257.     case 16:  
  258.         mediaType.subtype=MEDIASUBTYPE_RGB555;  
  259.         break;  
  260.     case 24:  
  261.         mediaType.subtype=MEDIASUBTYPE_RGB24;  
  262.         break;  
  263.     case 32:  
  264.         mediaType.subtype=MEDIASUBTYPE_RGB32;  
  265.         break;  
  266.     default:  
  267.         return E_FAIL;  
  268.     }  
  269.     mediaType.formattype = FORMAT_VideoInfo;  
  270.     hr = m_pSampGrabber->SetMediaType(&mediaType);  
  271.   
  272.     hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,  
  273.         m_pDevFilter,pSampleGrabberFilter,NULL);  
  274.     if(FAILED(hr))  
  275.         return hr;  
  276.   
  277.     hr = m_pSampGrabber->GetConnectedMediaType(&mediaType);  
  278.     if(FAILED(hr))  
  279.         return hr;  
  280.   
  281.     VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mediaType.pbFormat;  
  282.     g_sampleGrabberCB.m_lWidth = vih->bmiHeader.biWidth;  
  283.     g_sampleGrabberCB.m_lHeight = vih->bmiHeader.biHeight;  
  284.     // Configure the Sample Grabber  
  285.     hr = m_pSampGrabber->SetOneShot(FALSE);  
  286.     if (FAILED(hr))  
  287.         return hr;  
  288.     hr = m_pSampGrabber->SetBufferSamples(TRUE);  
  289.     if (FAILED(hr))  
  290.         return hr;  
  291.     // 1 = Use the BufferCB callback method.  
  292.     hr = m_pSampGrabber->SetCallback(&g_sampleGrabberCB,1);  
  293.   
  294.     //set capture video Window  
  295.     SetupVideoWindow(nLeft,nTop,nWide,nHeight);  
  296.     hr = m_pMediaControl->Run();  
  297.     if(FAILED(hr))  
  298.         return hr;  
  299.   
  300.     if (mediaType.cbFormat != 0)  
  301.     {  
  302.         CoTaskMemFree((PVOID)mediaType.pbFormat);  
  303.         mediaType.cbFormat = 0;  
  304.         mediaType.pbFormat = NULL;  
  305.     }  
  306.     if (mediaType.pUnk != NULL)  
  307.     {  
  308.         mediaType.pUnk->Release();  
  309.         mediaType.pUnk = NULL;  
  310.     }  
  311.     m_bConnect = TRUE;  
  312.     return hr;  
  313.   
  314. }  
  315.   
  316. void CaptureVideo::GrabOneFrame(BOOL bGrab)  
  317. {  
  318.     m_bGetOneShot = bGrab;  
  319.     g_sampleGrabberCB.m_bGetPicture = bGrab;  
  320. }  
  321.   
  322. HRESULT CaptureVideo::HandleGraphCapturePicture(void)  
  323. {  
  324.     //////////////////////////////////////////////////////////////////////////  
  325.     HRESULT hr;  
  326.     long evCode = 0;  
  327.     long lBufferSize = 0;  
  328.     BYTE *p;  
  329.     hr = m_pMediaEvent->WaitForCompletion(INFINITE, &evCode); //  
  330.     if (SUCCEEDED(hr))  
  331.     {  
  332.         switch(evCode)  
  333.         {  
  334.         case EC_COMPLETE:  
  335.             m_pSampGrabber->GetCurrentBuffer(&lBufferSize, NULL);  
  336.             p = new BYTE[lBufferSize];  
  337.             m_pSampGrabber->GetCurrentBuffer(&lBufferSize, (LONG*)p);// get Current buffer  
  338.             g_sampleGrabberCB.SaveBitmap(p,lBufferSize); //save bitmap  
  339.             break;  
  340.         default:  
  341.             break;  
  342.         }  
  343.     }  
  344.     //////////////////////////////////////////////////////////////////////////  
  345.     return hr;  
  346. }  

4.CaptureAudio.h 预览音频和保存捕获到的音频到文件

[cpp] view plaincopyprint?
  1. #ifndef __CAPTUREAUDIO_H__  
  2. #define __CAPTUREAUDIO_H__  
  3. #include "common.h"  
  4.   
  5. class CaptureAudio  
  6. {  
  7. public:  
  8.     CaptureAudio();  
  9.     ~CaptureAudio();  
  10.     HRESULT InitializeEnv(); //initialize environment  
  11.     HRESULT EnumAllDevices(HWND hCombox);  //Enumeration all devices  
  12.     void CloseInterface(); //close all interface  
  13.     HRESULT OpenDevice(BSTR bstrDeviceName);  
  14.     HRESULT BindDeviceFilter(BSTR deviceName,GUID DEVICE_CLSID,IBaseFilter **pBaseFilter);  
  15.     HRESULT DeviceConnect(IBaseFilter* pInputDevice,IBaseFilter* pOutputDevice, BSTR bstrInputPin, BSTR bstrOutputDevice);  
  16.   
  17. private:  
  18.     IGraphBuilder *m_pGraphBuilder;  
  19.     ICaptureGraphBuilder2 *m_pCaptureGB;  
  20.     IBaseFilter *m_pDevFilter;  
  21.     IMediaControl *m_pMediaContrl;  
  22. public:  
  23.     int m_nCaptureDeviceNumber;      //Device Count  
  24.     //vector<string> m_vecCapDeviceName; //the Device name  
  25.     TCHAR m_pCapDeviceName[10][MAX_PATH]; //the Device name  
  26.     TCHAR m_pRendererDeviceName[10][MAX_PATH]; // Render Device name      
  27.     HWND m_App;  
  28. };  
  29.   
  30. #endif  //__CAPTUREAUDIO_H__  

实现:

[cpp] view plaincopyprint?
  1. #include "CaptureAudio.h"  
  2.   
  3.   
  4. CaptureAudio::CaptureAudio()  
  5. {  
  6.     //COM Library Initialize  
  7.     if (FAILED(CoInitialize(NULL)))  
  8.     {  
  9.         Msg(m_App,TEXT("CoInitialize Failed!\r\n"));  
  10.         return;  
  11.     }  
  12.     //initialize member variable  
  13.     m_nCaptureDeviceNumber = 0;  
  14.     m_pDevFilter = NULL;  
  15.     m_pCaptureGB = NULL;  
  16.     m_pGraphBuilder = NULL;  
  17.     m_pMediaContrl = NULL;  
  18.     m_App = NULL;  
  19.     InitializeEnv();  
  20. }  
  21.   
  22. CaptureAudio::~CaptureAudio()  
  23. {  
  24.     CloseInterface();  
  25.     CoUninitialize();  
  26. }  
  27.   
  28. HRESULT CaptureAudio::EnumAllDevices(HWND hCombox)  
  29. {  
  30.     if (!hCombox)  
  31.         return S_FALSE;  
  32.     ICreateDevEnum *pDevEnum;  
  33.     IEnumMoniker   *pEnumMon;  
  34.     IMoniker       *pMoniker;  
  35.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,  
  36.         IID_ICreateDevEnum,(LPVOID*)&pDevEnum);  
  37.     if (SUCCEEDED(hr))  
  38.     {  
  39.         // get all Audio input Device Friendly Name  
  40.         hr = pDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory,&pEnumMon, 0);  
  41.         if (hr == S_FALSE)  
  42.         {  
  43.             hr = VFW_E_NOT_FOUND;  
  44.             return hr;  
  45.         }  
  46.         pEnumMon->Reset();  
  47.         ULONG cFetched;  
  48.         while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)  
  49.         {  
  50.             IPropertyBag *pProBag;  
  51.             hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);  
  52.             if (SUCCEEDED(hr))  
  53.             {  
  54.                 VARIANT varTemp;  
  55.                 varTemp.vt = VT_BSTR;  
  56.                 hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);  
  57.                 if (SUCCEEDED(hr))  
  58.                 {  
  59.                     //int nStrSize = WideCharToMultiByte(CP_ACP,0,varTemp.bstrVal,-1,0,0,NULL,FALSE);  
  60.                     //char *strName = new char[nStrSize];  
  61.                     //WideCharToMultiByte(CP_ACP,0,varTemp.bstrVal,-1,strName,nStrSize,NULL,FALSE);  
  62.                     //m_vecCapDeviceName.push_back(string(strName)); //push the device name to vector  
  63.   
  64.                     StringCchCopy(m_pCapDeviceName[m_nCaptureDeviceNumber],MAX_PATH,varTemp.bstrVal);  
  65.                     m_nCaptureDeviceNumber++; //Device number add 1  
  66.                     ::SendMessage(hCombox, CB_ADDSTRING, 0,(LPARAM)varTemp.bstrVal);  
  67.                     SysFreeString(varTemp.bstrVal);  
  68.                 }  
  69.                 pProBag->Release();  
  70.             }  
  71.             pMoniker->Release();  
  72.         }  
  73.         pEnumMon->Release();  
  74.   
  75.         //get All Audio Renderer Device Friendly Name  
  76.         hr = pDevEnum->CreateClassEnumerator(CLSID_AudioRendererCategory,&pEnumMon, 0);  
  77.         if (hr == S_FALSE)  
  78.         {  
  79.             hr = VFW_E_NOT_FOUND;  
  80.             return hr;  
  81.         }  
  82.         pEnumMon->Reset();  
  83.         int index = 0;  
  84.         while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)  
  85.         {  
  86.             IPropertyBag *pProBag;  
  87.             hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);  
  88.             if (SUCCEEDED(hr))  
  89.             {  
  90.                 VARIANT varTemp;  
  91.                 varTemp.vt = VT_BSTR;  
  92.                 hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);  
  93.                 if (SUCCEEDED(hr))  
  94.                 {  
  95.                     StringCchCopy(m_pRendererDeviceName[index],MAX_PATH,varTemp.bstrVal);  
  96.                     index++; //Device number add 1  
  97.                     SysFreeString(varTemp.bstrVal);  
  98.                 }  
  99.                 pProBag->Release();  
  100.             }  
  101.             pMoniker->Release();  
  102.         }  
  103.         pEnumMon->Release();  
  104.     }  
  105.     return hr;  
  106. }  
  107.   
  108. HRESULT CaptureAudio::InitializeEnv()  
  109. {  
  110.     HRESULT hr;  
  111.   
  112.     //Create the filter graph  
  113.     hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,  
  114.         IID_IGraphBuilder,(LPVOID*)&m_pGraphBuilder);  
  115.     if(FAILED(hr))  
  116.         return hr;  
  117.   
  118.     //Create the capture graph builder  
  119.     hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,  
  120.         IID_ICaptureGraphBuilder2,(LPVOID*)&m_pCaptureGB);  
  121.     if(FAILED(hr))  
  122.         return hr;  
  123.   
  124.     hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&m_pMediaContrl);  
  125.     if(FAILED(hr))  
  126.         return hr;  
  127.     m_pCaptureGB->SetFiltergraph(m_pGraphBuilder);  
  128.     if(FAILED(hr))  
  129.         return hr;  
  130.     return hr;  
  131. }  
  132.   
  133. void CaptureAudio::CloseInterface()  
  134. {  
  135.     if (m_pMediaContrl)  
  136.         m_pMediaContrl->Stop();  
  137.     //release interface  
  138.     ReleaseInterface(m_pDevFilter);  
  139.     ReleaseInterface(m_pCaptureGB);  
  140.     ReleaseInterface(m_pGraphBuilder);  
  141.     ReleaseInterface(m_pMediaContrl);  
  142. }  
  143.   
  144. HRESULT CaptureAudio::OpenDevice(BSTR bstrDeviceName)  
  145. {  
  146.     HRESULT hr;  
  147.     IBaseFilter  *pWaveDest = NULL, *pWriter = NULL, *pOutputDev = NULL;  
  148.     IFileSinkFilter *pSink= NULL;  
  149.     BSTR bstrTempDeviceName;  
  150.     BSTR bstrOutPin,bstrInPin;  
  151.     IBaseFilter *pPinTeeFilter = NULL;  
  152.       
  153.     hr = BindDeviceFilter(bstrDeviceName,CLSID_AudioInputDeviceCategory, &m_pDevFilter);  
  154.     if (FAILED(hr))  
  155.         return hr;  
  156.     // Add the audio capture filter to the filter graph.   
  157.     hr = m_pGraphBuilder->AddFilter(m_pDevFilter, L"Capture");  
  158.     if (FAILED(hr))  
  159.         return hr;  
  160.     /************************************************************************/  
  161.     /* Audio Prieview                                           */  
  162.     /************************************************************************/  
  163.     bstrTempDeviceName = SysAllocString(L"Infinite Pin Tee Filter");  
  164.     hr = BindDeviceFilter(bstrTempDeviceName,CLSID_LegacyAmFilterCategory,&pPinTeeFilter);  
  165.     if (FAILED(hr))  
  166.         return hr;  
  167.     hr = m_pGraphBuilder->AddFilter(pPinTeeFilter,bstrTempDeviceName);  
  168.     bstrInPin = SysAllocString(L"Capture");  
  169.     bstrOutPin = SysAllocString(L"Input");  
  170.       
  171.     hr = DeviceConnect(m_pDevFilter,pPinTeeFilter,bstrInPin,bstrOutPin);  
  172.     if(FAILED(hr))  
  173.         return hr;  
  174.     //////////////////////////////////////////////////////////////////////////  
  175.     // output the Rendered Device  
  176.     SysReAllocString(&bstrTempDeviceName,m_pRendererDeviceName[0]); //Rendered Device Name;  
  177.     hr = BindDeviceFilter(bstrTempDeviceName,CLSID_AudioRendererCategory,&pOutputDev);  
  178.     if(FAILED(hr))  
  179.         return hr;  
  180.     hr = m_pGraphBuilder->AddFilter(pOutputDev,bstrTempDeviceName);  
  181.     if(FAILED(hr))  
  182.         return hr;  
  183.     SysReAllocString(&bstrInPin,L"Output1");  
  184.     SysReAllocString(&bstrOutPin,L"Audio Input pin (rendered)");  
  185.     hr = DeviceConnect(pPinTeeFilter,pOutputDev,bstrInPin,bstrOutPin);  
  186.     if(FAILED(hr))  
  187.         return hr;  
  188.     //////////////////////////////////////////////////////////////////////////  
  189.   
  190.   
  191.     //Add AudioRecorder WAV Dest  
  192.     SysReAllocString(&bstrTempDeviceName,TEXT("AudioRecorder WAV Dest"));  
  193.     hr = BindDeviceFilter(bstrTempDeviceName,CLSID_LegacyAmFilterCategory, &pWaveDest);  
  194.     if (FAILED(hr))  
  195.         return hr;  
  196.     hr = m_pGraphBuilder->AddFilter(pWaveDest,bstrTempDeviceName);  
  197.     if (FAILED(hr))  
  198.         return hr;  
  199.     //Connect the AudioRecorder WAV Dest  
  200.     SysReAllocString(&bstrInPin,L"Output2");  
  201.     SysReAllocString(&bstrOutPin,L"In");  
  202.     hr = DeviceConnect(pPinTeeFilter,pWaveDest,bstrInPin,bstrOutPin);  
  203.     if (FAILED(hr))  
  204.         return hr;  
  205.       
  206.     // output Filter Wirter  
  207.     SysReAllocString(&bstrTempDeviceName,L"File writer");  
  208.     hr = BindDeviceFilter(bstrTempDeviceName,CLSID_LegacyAmFilterCategory,&pWriter);      
  209.     if (FAILED(hr))  
  210.         return hr;  
  211.   
  212.     IFileSinkFilter *pFileSink= NULL;  
  213.     SysReAllocString(&bstrTempDeviceName,L"test.wav");  
  214.     hr = pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pFileSink);  
  215.     if(FAILED(hr))  
  216.         return hr;  
  217.     hr = pFileSink->SetFileName((LPCOLESTR)bstrTempDeviceName,NULL);  
  218.     if(FAILED(hr))  
  219.         return hr;  
  220.     hr = m_pGraphBuilder->AddFilter(pWriter,bstrTempDeviceName);  
  221.     if(FAILED(hr))  
  222.         return hr;  
  223.   
  224.     SysReAllocString(&bstrInPin,L"Out");  
  225.     SysReAllocString(&bstrOutPin,L"in");  
  226.   
  227.     hr = DeviceConnect(pWaveDest,pWriter,bstrInPin,bstrOutPin);  
  228.     if(FAILED(hr))  
  229.         return hr;  
  230.     SysFreeString(bstrInPin);  
  231.     SysFreeString(bstrOutPin);  
  232.     SysFreeString(bstrTempDeviceName);  
  233.   
  234.     hr = m_pMediaContrl->Run();  
  235.     if(FAILED(hr))  
  236.         return hr;  
  237.     return hr;  
  238.   
  239. }  
  240.   
  241. HRESULT CaptureAudio::DeviceConnect(IBaseFilter* pInputDevice,IBaseFilter* pOutputDevice, BSTR bstrInputPin, BSTR bstrOutputDevice)  
  242. {  
  243.     HRESULT hr;  
  244.     IEnumPins *pInputPins = NULL, *pOutputPins = NULL;  
  245.     IPin *pIn = NULL, *pOut = NULL;  
  246.   
  247.     hr = pInputDevice->EnumPins(&pInputPins);  
  248.     if (SUCCEEDED(hr))  
  249.     {  
  250.         hr = pInputDevice->FindPin(bstrInputPin,&pIn);  
  251.         if(FAILED(hr))  
  252.             return hr;  
  253.     }else  
  254.         return hr;  
  255.   
  256.     hr = pOutputDevice->EnumPins(&pOutputPins);  
  257.     if (SUCCEEDED(hr))  
  258.     {  
  259.         hr = pOutputDevice->FindPin(bstrOutputDevice,&pOut);  
  260.         if(FAILED(hr))  
  261.             return hr;  
  262.     }  
  263.   
  264.     hr = pIn->Connect(pOut, NULL);  
  265.     if (FAILED(hr))  
  266.         return hr;  
  267.     return hr;  
  268. }  
  269.   
  270. HRESULT CaptureAudio::BindDeviceFilter(BSTR deviceName,GUID DEVICE_CLSID,IBaseFilter **pBaseFilter)  
  271. {  
  272.     ICreateDevEnum *pDevEnum;  
  273.     IEnumMoniker   *pEnumMon;  
  274.     IMoniker       *pMoniker;  
  275.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,  
  276.         IID_ICreateDevEnum,(LPVOID*)&pDevEnum);  
  277.     if (SUCCEEDED(hr))  
  278.     {  
  279.         hr = pDevEnum->CreateClassEnumerator(DEVICE_CLSID,&pEnumMon, 0);  
  280.         if (hr == S_FALSE)  
  281.         {  
  282.             hr = VFW_E_NOT_FOUND;  
  283.             return hr;  
  284.         }  
  285.         pEnumMon->Reset();  
  286.         ULONG cFetched;  
  287.         while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)  
  288.         {  
  289.             IPropertyBag *pProBag;  
  290.             hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);  
  291.             if (SUCCEEDED(hr))  
  292.             {  
  293.                 VARIANT varTemp;  
  294.                 varTemp.vt = VT_BSTR;  
  295.                 hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);  
  296.                 if (SUCCEEDED(hr))  
  297.                 {  
  298.                     if (Bstr_Compare(varTemp.bstrVal,deviceName) == true)  
  299.                     {  
  300.                         hr = pMoniker->BindToObject(NULL,NULL,IID_IBaseFilter,(LPVOID*)pBaseFilter);  
  301.                         if (SUCCEEDED(hr))  
  302.                             return hr;  
  303.                     }  
  304.                     SysFreeString(varTemp.bstrVal);  
  305.                 }  
  306.                 pProBag->Release();  
  307.             }  
  308.             pMoniker->Release();  
  309.         }  
  310.         pEnumMon->Release();  
  311.     }  
  312.     return hr;  
  313. }  

5.测试:Main.cpp

[cpp] view plaincopyprint?
  1. #include "CaptureVideo.h"  
  2. #include "CaptureAudio.h"  
  3. #include "resource.h"  
  4. #define ID_COMBOBOX  10000  
  5. #define ID_COMBOBOX2 10001  
  6. #define ID_TIMER     10002  
  7.   
  8. CaptureVideo g_CaptureVideo;  
  9.   
  10. CaptureAudio g_CaptureAudio;  
  11. HWND hwndCombo1;  
  12. HWND hwndCombo2;  
  13. BSTR bstrDeviceName;  
  14.   
  15. HICON g_hIconLarge;  
  16. HICON g_hIconSmall;  
  17.   
  18. int g_nTimerCount = 0;  
  19.   
  20. BOOL CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);  
  21. VOID CALLBACK TimerGetPicture(HWND hDlg, UINT message, UINT iTimerID, DWORD dwTimer);  
  22. VOID SetWindowPosCenter(HWND hDlg);  
  23.   
  24. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)  
  25. {  
  26.   
  27.   
  28.     g_hIconLarge = static_cast<HICON>(LoadImage(hInstance, TEXT("IDI_ICON1"), IMAGE_ICON,  //set large ico  
  29.         GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0));  
  30.     g_hIconSmall = static_cast<HICON>(LoadImage(hInstance, TEXT("IDI_ICON1"), IMAGE_ICON,   //set small ico  
  31.         GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), 0));  
  32.   
  33.     MSG msg;  
  34.     HWND hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WndProc);  
  35.           
  36.     ShowWindow(hDlg,iCmdShow);  
  37.     UpdateWindow(hDlg);  
  38.   
  39.   
  40.     while (GetMessage (&msg, NULL, 0, 0))  
  41.     {  
  42.         TranslateMessage (&msg);  
  43.         DispatchMessage (&msg);  
  44.     }  
  45.   
  46.     CoUninitialize();  
  47.     // Exit  
  48.     DestroyIcon(g_hIconLarge);  
  49.     DestroyIcon(g_hIconSmall);    
  50.     return msg.wParam;  
  51. }  
  52.   
  53. BOOL CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  
  54. {  
  55.     int nGetComboxCount = 0;  
  56.     int iGetCurSel = 0;  
  57.     DWORD dwBaseUnits;  
  58.     switch(message)  
  59.     {  
  60.     case WM_INITDIALOG:  
  61.         {  
  62.             SendMessage(hDlg,WM_SETICON,FALSE,reinterpret_cast<LPARAM>(g_hIconSmall));  
  63.             SendMessage(hDlg,WM_SETICON,TRUE,reinterpret_cast<LPARAM>(g_hIconLarge));  
  64.             //////////////////////////////////////////////////////////////////////////  
  65.             SetWindowPosCenter(hDlg); //set Dialog at window center  
  66.             //////////////////////////////////////////////////////////////////////////  
  67.             g_CaptureVideo.m_App = hDlg;  
  68.             g_CaptureAudio.m_App = hDlg;  
  69.             dwBaseUnits = GetDialogBaseUnits();   
  70.             hwndCombo1 = CreateWindow(TEXT("COMBOBOX"), TEXT(""),   
  71.                 CBS_DROPDOWN | WS_CHILD | WS_VISIBLE,   
  72.                 (6 * LOWORD(dwBaseUnits)) / 4,   
  73.                 (2 * HIWORD(dwBaseUnits)) / 8,   
  74.                 (100 * LOWORD(dwBaseUnits)) / 4,   
  75.                 (50 * HIWORD(dwBaseUnits)) / 8,   
  76.                 hDlg, (HMENU)ID_COMBOBOX, NULL, NULL);     
  77.   
  78.             hwndCombo2 = CreateWindow(TEXT("COMBOBOX"), TEXT(""),   
  79.                 CBS_DROPDOWN | WS_CHILD | WS_VISIBLE,   
  80.                 (110 * LOWORD(dwBaseUnits)) / 4,   
  81.                 (2 * HIWORD(dwBaseUnits)) / 8,   
  82.                 (100 * LOWORD(dwBaseUnits)) / 4,   
  83.                 (50 * HIWORD(dwBaseUnits)) / 8,   
  84.                 hDlg, (HMENU)ID_COMBOBOX2, NULL, NULL);     
  85.   
  86.             //Video  
  87.             g_CaptureVideo.EnumAllDevices(hwndCombo1); //Enum All Camera  
  88.             nGetComboxCount = ComboBox_GetCount(hwndCombo1);  
  89.             if (nGetComboxCount == 0)  
  90.                 ComboBox_Enable(hwndCombo1,FALSE);  
  91.             else  
  92.                 ComboBox_SetCurSel(hwndCombo1,0);  
  93.   
  94.             if(g_CaptureVideo.m_nCaptureDeviceNumber == 0)  
  95.             {  
  96.                 Msg(hDlg,TEXT("没有摄像头设备"));  
  97.                 EnableWindow(GetDlgItem(hDlg,IDC_PREVIWE),FALSE);  
  98.             }  
  99.             EnableWindow(GetDlgItem(hDlg,IDONESHOT),FALSE);  
  100.   
  101.             // Audio  
  102.             g_CaptureAudio.EnumAllDevices(hwndCombo2);  
  103.             nGetComboxCount = ComboBox_GetCount(hwndCombo2);  
  104.             if (nGetComboxCount == 0)  
  105.                 ComboBox_Enable(hwndCombo2,FALSE);  
  106.             else  
  107.                 ComboBox_SetCurSel(hwndCombo2,0);  
  108.             if(g_CaptureAudio.m_nCaptureDeviceNumber == 0)  
  109.             {  
  110.                 Msg(hDlg,TEXT("没有音频设备"));  
  111.                 EnableWindow(GetDlgItem(hDlg,IDC_PREVIWE),FALSE);  
  112.             }  
  113.         }  
  114.         return TRUE;  
  115.     case WM_DESTROY:  
  116.         {  
  117.             g_CaptureVideo.CloseInterface();  
  118.             PostQuitMessage(0);  
  119.         }  
  120.         break;  
  121.     case WM_COMMAND:  
  122.         switch (LOWORD(wParam))  
  123.         {  
  124.         case IDCANCEL:  
  125.             {  
  126.                 PostQuitMessage(0);  
  127.             }  
  128.            break;  
  129.         case IDONESHOT:  
  130.             {  
  131.                 //g_CaptureVideo.GrabOneFrame(TRUE);  
  132.                 SetTimer(hDlg,ID_TIMER,150,TimerGetPicture);  
  133.             }  
  134.             break;  
  135.           
  136.         case IDC_PREVIWE:  
  137.             {  
  138.                 //Video  
  139.                 iGetCurSel = ComboBox_GetCurSel(hwndCombo1);  
  140.                 g_CaptureVideo.OpenDevice(iGetCurSel,20,30,430,400);  
  141.                 EnableWindow(GetDlgItem(hDlg,IDONESHOT),TRUE);  
  142.   
  143.                 //Audio  
  144.                 iGetCurSel = ComboBox_GetCurSel(hwndCombo2);  
  145.                 bstrDeviceName = SysAllocString(g_CaptureAudio.m_pCapDeviceName[iGetCurSel]);  
  146.                 g_CaptureAudio.OpenDevice(bstrDeviceName);  
  147.             }  
  148.             break;  
  149.         defaultbreak;  
  150.         }  
  151.     case WM_MOVE:  
  152.         g_CaptureVideo.m_pVideoWindow->NotifyOwnerMessage((OAHWND)hDlg, message, wParam, lParam);  
  153.         break;  
  154.     }  
  155.     return (FALSE);  
  156. }  
  157.   
  158. VOID CALLBACK TimerGetPicture(HWND hDlg, UINT message, UINT iTimerID, DWORD dwTimer)  
  159. {  
  160.     if(g_nTimerCount < 25)  
  161.     {  
  162.         g_CaptureVideo.GrabOneFrame(TRUE);  
  163.         g_nTimerCount++;  
  164.     }else  
  165.     {  
  166.         KillTimer(hDlg,ID_TIMER);  
  167.         g_nTimerCount = 0;  
  168.     }  
  169. }  
  170.   
  171. VOID SetWindowPosCenter(HWND hDlg)  
  172. {  
  173.     int cxWindow,cyWindow;  //window Screen width and height  
  174.     RECT hDlgRect;          //Dialog Rect  
  175.     int cxDialog,cyDialog;  //Dialog Screen width and height  
  176.     int cxSetPos,cySetPos;  
  177.   
  178.     GetWindowRect(hDlg,&hDlgRect);  
  179.     //  
  180.     cxDialog = hDlgRect.right - hDlgRect.left;  
  181.     cyDialog = hDlgRect.bottom - hDlgRect.top;  
  182.     //  
  183.     cxWindow = GetSystemMetrics(SM_CXSCREEN);  
  184.     cyWindow = GetSystemMetrics(SM_CYSCREEN);  
  185.     //  
  186.     cxSetPos = (cxWindow-cxDialog)/2;  
  187.     cySetPos = (cyWindow-cyDialog)/2;  
  188.   
  189.     SetWindowPos(hDlg,NULL,cxSetPos,cySetPos,0,0,SWP_NOSIZE);  
  190.   
  191.   
  192. }  

原创粉丝点击