设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: zh99998
打印 上一主题 下一主题

[RMVX发布] RM视频播放器 [2011-4-20更新异步模式 可以融合进 RM 画面]

  [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
52 小时
注册时间
2011-4-22
帖子
15
67
发表于 2011-4-24 00:40:14 | 只看该作者
为什么我用同样的格式视频不能播放视频,只能听到声音,用默认的那个却很正常?
《红狼部落》honglangbuluo.51.com
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
66
发表于 2011-4-23 15:46:12 | 只看该作者
回复 yangff 的帖子

那咱去试试看. FPS 掉不多的话还好~~~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
526 小时
注册时间
2007-12-24
帖子
158
65
发表于 2011-4-23 13:11:42 | 只看该作者
这个要支持!!
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

64
发表于 2011-4-22 22:45:42 | 只看该作者
本帖最后由 yangff 于 2011-4-22 22:49 编辑
蕾米莉亚·斯卡雷特 发表于 2011-4-22 22:37
回复 yangff 的帖子

解码链 都是会找可以使用的, 基本上算是最优的组合方法。


啥……反正我是记得FFmpge可以解几乎所有的……当然现在这么多乱七八糟的也不好说,但是至少常用的没问题的说……
Bitmap我的意思是这样的
class Video < Bitmap
  def address

    buffer, ad = "xxxx", object_id * 2 + 16

    RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8

    RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16

    RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]

  end
  def initialize(url)
    @handle,w,h=GetRect.call(url).unpack("L*")
    super(w,h)
    SetAddr(@handle,address)
  end
  def update
    if (FPS)
      MovieUpdate.call(@handle)
    end
  end
  def dispose
    MovieDispose.call(@handle)
  end
end
效率不用担心,我写过一个斜切的,每桢PIA一个新的Bitmap然后用新的度数切一遍再XXXXXX再修改透明度,FPS在50无压力只是加一个A更无压力了肯定……我担心的是Dx但效率反而(d7说他能到60我才不信……)
只不过我对RM统计的FPS各种怀疑不需要原因的那种
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
63
发表于 2011-4-22 22:37:39 | 只看该作者
回复 yangff 的帖子

解码链 都是会找可以使用的, 基本上算是最优的组合方法。

A 通道什么的, DX 不应该不支持才对。 这个问题不大。 主要是 blt 的效率问题 。

Bitmap 先 new 的话, 也应该在内存里才对吧。

而且视频最少需要 24FPS 才流畅。 估计效率上很麻烦。

解码库什么的, 有空有需求了再说。万能解码库啥的,还没遇见过。

QQPlayer 还不算是万能的。 它的解码库是用 dll 堆起来的。 = =
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

62
发表于 2011-4-22 21:49:24 | 只看该作者
蕾米莉亚·斯卡雷特 发表于 2011-4-22 21:38
回复 yangff 的帖子

少了个 A 感觉少了好多。

不会,扫一遍不会影响FPS的= =虽然是Blt但是直接搞内存还是很快的 = =
GetCurrentBuffer不知道支不支持A通道= =但是Dx的话因该是可以的吧
至于解码……我觉得弄个FFmpge什么的就差不多了吧,Kmp用的也就是FF啊
不过GPL很讨厌就是了
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
61
发表于 2011-4-22 21:38:43 | 只看该作者
回复 yangff 的帖子

少了个 A 感觉少了好多。

视频 Filter 都是可以截图的。 摄像头本来想添加进去, 不过想想这个貌似用处不大。 开着 RM 视频聊天么? = =

总感觉每帧截图再转换再加载再显示, 效率能达到 10FPS 就不错了。 这样可使每帧 Blt 啊。
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

60
发表于 2011-4-22 21:20:11 | 只看该作者
本帖最后由 yangff 于 2011-4-22 21:22 编辑
蕾米莉亚·斯卡雷特 发表于 2011-4-22 20:48
回复 yangff 的帖子

GetCurrentBuffer


这种方法的FPS在30左右时无压力的……不知道60会不会……大不了跳帧= =反正有几个视屏的FPS到60了= =
但是据说CPU各种吃没试过= =这个导的是摄像头的

这段代码本来是用来把DS的那一坨转成Ocv的那一坨……
显然这种玩意返回的东西可以在RM里面直接用
Rm的Bitmap是BGRA的Top-down=int
这个返回的是BGR模式的Top-down
到时候怎么位移一下就好了= =
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
59
发表于 2011-4-22 20:48:14 | 只看该作者
回复 yangff 的帖子

GetCurrentBuffer

截图什么的功能打算在 3.1 3.2 的时候添加。 不过每帧都截图是不是太那个啊。 而且要想真的和 Rm 合体什么的, 有点难度。

不过目前最大的问题还是 解码链路 还是自动连接,对系统的要求比较大就是了。 手动连接就好多了。 不过要求很高。

对于返回的那个 内存图片 的内存结构会不会还没研究过。 (大概是一样的)
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

58
发表于 2011-4-22 20:38:58 | 只看该作者
本帖最后由 yangff 于 2011-4-22 20:40 编辑
蕾米莉亚·斯卡雷特 发表于 2011-4-22 20:23
回复 yangff 的帖子

核心是 DirectShow , 解码链 返回的是 IPin 接口。 显示啥的, 是框架问题。 不是 Bi ...


DS 貌似可以导出Bitmap矩阵的
GetCurrentBuffer(size,buff)
一段有关的代码……欢迎蛋疼……表示没装Dx/Platform SDK= =
能成的话就用Mp4做真战斗背景神马的了-= = |||
  1. //////////////////////////////////////////////////////////////////////
  2. // Video Capture using DirectShow
  3. // Author: Shiqi Yu ([email protected])
  4. // Thanks to:
  5. //                HardyAI@OpenCV China
  6. //                flymanbox@OpenCV China (for his contribution to function CameraName, and frame width/height setting)
  7. // Last modification: April 9, 2009
  8. //////////////////////////////////////////////////////////////////////


  9. //////////////////////////////////////////////////////////////////////
  10. // 使用说明:
  11. //   1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
  12. //   2. 菜单 Project->Settings->Settings for:(All configurations)->C/C++->Category(Preprocessor)->Additional include directories
  13. //      设置为 DirectShow/Include
  14. //   3. 菜单 Project->Settings->Settings for:(All configurations)->Link->Category(Input)->Additional library directories
  15. //      设置为 DirectShow/Lib
  16. //////////////////////////////////////////////////////////////////////

  17. // CameraDS.cpp: implementation of the CCameraDS class.
  18. //
  19. //////////////////////////////////////////////////////////////////////

  20. #include "CameraDS.h"

  21. #pragma comment(lib,"Strmiids.lib")
  22. //////////////////////////////////////////////////////////////////////
  23. // Construction/Destruction
  24. //////////////////////////////////////////////////////////////////////

  25. CCameraDS::CCameraDS()
  26. {
  27.         m_bConnected = m_bLock = m_bChanged = false;
  28.         m_nWidth = m_nHeight = 0;
  29.         m_nBufferSize = 0;

  30.         m_pFrame = NULL;

  31.         m_pNullFilter = NULL;
  32.         m_pMediaEvent = NULL;
  33.         m_pSampleGrabberFilter = NULL;
  34.         m_pGraph = NULL;

  35.         CoInitialize(NULL);
  36. }

  37. CCameraDS::~CCameraDS()
  38. {
  39.         CloseCamera();
  40.         CoUninitialize();
  41. }

  42. void CCameraDS::CloseCamera()
  43. {
  44.         if(m_bConnected)
  45.         {
  46.                 m_pMediaControl->Stop();
  47.         }

  48.         m_pGraph = NULL;
  49.         m_pDeviceFilter = NULL;
  50.         m_pMediaControl = NULL;
  51.         m_pSampleGrabberFilter = NULL;
  52.         m_pSampleGrabber = NULL;
  53.         m_pGrabberInput = NULL;
  54.         m_pGrabberOutput = NULL;
  55.         m_pCameraOutput = NULL;
  56.         m_pMediaEvent = NULL;
  57.         m_pNullFilter = NULL;
  58.         m_pNullInputPin = NULL;

  59.         if (m_pFrame)
  60.         {
  61.                 cvReleaseImage(&m_pFrame);
  62.         }

  63.         m_bConnected = m_bLock = m_bChanged = false;
  64.         m_nWidth = m_nHeight = 0;
  65.         m_nBufferSize = 0;
  66. }

  67. bool CCameraDS::OpenCamera(int nCamID, bool bDisplayProperties, int nWidth, int nHeight)
  68. {
  69.         HRESULT hr = S_OK;

  70.         CoInitialize(NULL);
  71.         // Create the Filter Graph Manager.
  72.         hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);

  73.         hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&m_pSampleGrabberFilter);

  74.         hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **) &m_pMediaControl);
  75.         hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **) &m_pMediaEvent);

  76.         hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID*) &m_pNullFilter);

  77.         hr = m_pGraph->AddFilter(m_pNullFilter, L"NullRenderer");

  78.         hr = m_pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber, (void**)&m_pSampleGrabber);

  79.         AM_MEDIA_TYPE   mt;
  80.         ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
  81.         mt.majortype = MEDIATYPE_Video;
  82.         mt.subtype = MEDIASUBTYPE_RGB24;
  83.         mt.formattype = FORMAT_VideoInfo;
  84.         hr = m_pSampleGrabber->SetMediaType(&mt);
  85.         MYFREEMEDIATYPE(mt);

  86.         m_pGraph->AddFilter(m_pSampleGrabberFilter, L"Grabber");

  87.         // Bind Device Filter.  We know the device because the id was passed in
  88.         BindFilter(nCamID, &m_pDeviceFilter);
  89.         m_pGraph->AddFilter(m_pDeviceFilter, NULL);

  90.         CComPtr<IEnumPins> pEnum;
  91.         m_pDeviceFilter->EnumPins(&pEnum);

  92.         hr = pEnum->Reset();
  93.         hr = pEnum->Next(1, &m_pCameraOutput, NULL);

  94.         pEnum = NULL;
  95.         m_pSampleGrabberFilter->EnumPins(&pEnum);
  96.         pEnum->Reset();
  97.         hr = pEnum->Next(1, &m_pGrabberInput, NULL);

  98.         pEnum = NULL;
  99.         m_pSampleGrabberFilter->EnumPins(&pEnum);
  100.         pEnum->Reset();
  101.         pEnum->Skip(1);
  102.         hr = pEnum->Next(1, &m_pGrabberOutput, NULL);

  103.         pEnum = NULL;
  104.         m_pNullFilter->EnumPins(&pEnum);
  105.         pEnum->Reset();
  106.         hr = pEnum->Next(1, &m_pNullInputPin, NULL);

  107.         //SetCrossBar();

  108.         if (bDisplayProperties)
  109.         {
  110.                 CComPtr<ISpecifyPropertyPages> pPages;

  111.                 HRESULT hr = m_pCameraOutput->QueryInterface(IID_ISpecifyPropertyPages, (void**)&pPages);
  112.                 if (SUCCEEDED(hr))
  113.                 {
  114.                         PIN_INFO PinInfo;
  115.                         m_pCameraOutput->QueryPinInfo(&PinInfo);

  116.                         CAUUID caGUID;
  117.                         pPages->GetPages(&caGUID);

  118.                         OleCreatePropertyFrame(NULL, 0, 0,
  119.                                                 L"Property Sheet", 1,
  120.                                                 (IUnknown **)&(m_pCameraOutput.p),
  121.                                                 caGUID.cElems, caGUID.pElems,
  122.                                                 0, 0, NULL);

  123.                         CoTaskMemFree(caGUID.pElems);
  124.                         PinInfo.pFilter->Release();
  125.                 }
  126.                 pPages = NULL;
  127.         }
  128.         else
  129.         {
  130.                 //////////////////////////////////////////////////////////////////////////////
  131.                 // 加入由 lWidth和lHeight设置的摄像头的宽和高 的功能,默认320*240
  132.                 // by flymanbox @2009-01-24
  133.                 //////////////////////////////////////////////////////////////////////////////
  134.                 IAMStreamConfig *iconfig = NULL;
  135.                 hr = m_pCameraOutput->QueryInterface(IID_IAMStreamConfig, (void**)&iconfig);   

  136.                 AM_MEDIA_TYPE *pmt;
  137.                 if(iconfig->GetFormat(&pmt) !=S_OK)
  138.                 {
  139.                         //printf("GetFormat Failed ! \n");
  140.                         return false;
  141.                 }

  142.                 // 3、考虑如果此时的的图像大小正好是 nWidth * nHeight,则就不用修改了。
  143.                 if ((pmt->lSampleSize != (nWidth * nHeight * 3)) && (pmt->formattype == FORMAT_VideoInfo))
  144.                 {
  145.                         VIDEOINFOHEADER *phead = (VIDEOINFOHEADER*)(pmt->pbFormat);
  146.                         phead->bmiHeader.biWidth = nWidth;
  147.                         phead->bmiHeader.biHeight = nHeight;
  148.                         if((hr = iconfig->SetFormat(pmt)) != S_OK)
  149.                         {
  150.                                 return false;
  151.                         }
  152.                 }

  153.                 iconfig->Release();
  154.                 iconfig=NULL;
  155.                 MYFREEMEDIATYPE(*pmt);
  156.         }

  157.         hr = m_pGraph->Connect(m_pCameraOutput, m_pGrabberInput);
  158.         hr = m_pGraph->Connect(m_pGrabberOutput, m_pNullInputPin);

  159.         if (FAILED(hr))
  160.         {
  161.                 switch(hr)
  162.                 {
  163.                         case VFW_S_NOPREVIEWPIN :
  164.                                 break;
  165.                         case E_FAIL :
  166.                                 break;
  167.                         case E_INVALIDARG :
  168.                                 break;
  169.                         case E_POINTER :
  170.                                 break;
  171.                 }
  172.         }

  173.         m_pSampleGrabber->SetBufferSamples(TRUE);
  174.         m_pSampleGrabber->SetOneShot(TRUE);
  175.    
  176.         hr = m_pSampleGrabber->GetConnectedMediaType(&mt);
  177.         if(FAILED(hr))
  178.         {
  179.                 return false;
  180.         }

  181.         VIDEOINFOHEADER *videoHeader;
  182.         videoHeader = reinterpret_cast<VIDEOINFOHEADER*>(mt.pbFormat);
  183.         m_nWidth = videoHeader->bmiHeader.biWidth;
  184.         m_nHeight = videoHeader->bmiHeader.biHeight;
  185.         m_bConnected = true;

  186.         pEnum = NULL;
  187.         return true;
  188. }


  189. bool CCameraDS::BindFilter(int nCamID, IBaseFilter **pFilter)
  190. {
  191.         if (nCamID < 0)
  192.         {
  193.                 return false;
  194.         }

  195.     // enumerate all video capture devices
  196.         CComPtr<ICreateDevEnum> pCreateDevEnum;
  197.         HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
  198.         if (hr != NOERROR)
  199.         {
  200.                 return false;
  201.         }

  202.     CComPtr<IEnumMoniker> pEm;
  203.     hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
  204.     if (hr != NOERROR)
  205.         {
  206.                 return false;
  207.     }

  208.     pEm->Reset();
  209.     ULONG cFetched;
  210.     IMoniker *pM;
  211.         int index = 0;
  212.     while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= nCamID)
  213.     {
  214.                 IPropertyBag *pBag;
  215.                 hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
  216.                 if(SUCCEEDED(hr))
  217.                 {
  218.                         VARIANT var;
  219.                         var.vt = VT_BSTR;
  220.                         hr = pBag->Read(L"FriendlyName", &var, NULL);
  221.                         if (hr == NOERROR)
  222.                         {
  223.                                 if (index == nCamID)
  224.                                 {
  225.                                         pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter);
  226.                                 }
  227.                                 SysFreeString(var.bstrVal);
  228.                         }
  229.                         pBag->Release();
  230.                 }
  231.                 pM->Release();
  232.                 index++;
  233.     }

  234.         pCreateDevEnum = NULL;
  235.         return true;
  236. }

  237. //将输入crossbar变成PhysConn_Video_Composite
  238. void CCameraDS::SetCrossBar()
  239. {
  240.         int i;
  241.         IAMCrossbar *pXBar1 = NULL;
  242.         ICaptureGraphBuilder2 *pBuilder = NULL;

  243.         HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void **)&pBuilder);

  244.         if (SUCCEEDED(hr))
  245.         {
  246.                 hr = pBuilder->SetFiltergraph(m_pGraph);
  247.         }

  248.         hr = pBuilder->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, m_pDeviceFilter,IID_IAMCrossbar, (void**)&pXBar1);

  249.         if (SUCCEEDED(hr))
  250.         {
  251.                   long OutputPinCount, InputPinCount;
  252.                 long PinIndexRelated, PhysicalType;
  253.                 long inPort = 0, outPort = 0;

  254.                 pXBar1->get_PinCounts(&OutputPinCount, &InputPinCount);
  255.                 for( i =0;i<InputPinCount;i++)
  256.                 {
  257.                         pXBar1->get_CrossbarPinInfo(TRUE,i,&PinIndexRelated,&PhysicalType);
  258.                         if(PhysConn_Video_Composite==PhysicalType)
  259.                         {
  260.                                 inPort = i;
  261.                                 break;
  262.                         }
  263.                 }
  264.                 for( i =0;i<OutputPinCount;i++)
  265.                 {
  266.                         pXBar1->get_CrossbarPinInfo(FALSE,i,&PinIndexRelated,&PhysicalType);
  267.                         if(PhysConn_Video_VideoDecoder==PhysicalType)
  268.                         {
  269.                                 outPort = i;
  270.                                 break;
  271.                         }
  272.                 }
  273.   
  274.                 if(S_OK==pXBar1->CanRoute(outPort,inPort))
  275.                 {
  276.                         pXBar1->Route(outPort,inPort);
  277.                 }
  278.                 pXBar1->Release();  
  279.         }
  280.         pBuilder->Release();
  281. }

  282. /*
  283. The returned image can not be released.
  284. */
  285. IplImage* CCameraDS::QueryFrame()
  286. {
  287.         long evCode, size = 0;

  288.         m_pMediaControl->Run();
  289.         m_pMediaEvent->WaitForCompletion(INFINITE, &evCode);

  290.         m_pSampleGrabber->GetCurrentBuffer(&size, NULL);

  291.         //if the buffer size changed
  292.         if (size != m_nBufferSize)
  293.         {
  294.                 if (m_pFrame)
  295.                 {
  296.                         cvReleaseImage(&m_pFrame);
  297.                 }

  298.                 m_nBufferSize = size;
  299.                 m_pFrame = cvCreateImage(cvSize(m_nWidth, m_nHeight), IPL_DEPTH_8U, 3);
  300.         }

  301.         m_pSampleGrabber->GetCurrentBuffer(&m_nBufferSize, (long*)m_pFrame->imageData);
  302.         cvFlip(m_pFrame);

  303.         return m_pFrame;
  304. }

  305. int CCameraDS::CameraCount()
  306. {
  307.         int count = 0;
  308.         CoInitialize(NULL);

  309.    // enumerate all video capture devices
  310.         CComPtr<ICreateDevEnum> pCreateDevEnum;
  311.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);

  312.     CComPtr<IEnumMoniker> pEm;
  313.     hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
  314.     if (hr != NOERROR)
  315.         {
  316.                 return count;
  317.     }

  318.     pEm->Reset();
  319.     ULONG cFetched;
  320.     IMoniker *pM;
  321.     while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
  322.     {
  323.                 count++;
  324.     }

  325.         pCreateDevEnum = NULL;
  326.         pEm = NULL;
  327.         return count;
  328. }

  329. int CCameraDS::CameraName(int nCamID, char* sName, int nBufferSize)
  330. {
  331.         int count = 0;
  332.         CoInitialize(NULL);

  333.    // enumerate all video capture devices
  334.         CComPtr<ICreateDevEnum> pCreateDevEnum;
  335.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);

  336.     CComPtr<IEnumMoniker> pEm;
  337.     hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
  338.     if (hr != NOERROR) return 0;

  339.     pEm->Reset();
  340.     ULONG cFetched;
  341.     IMoniker *pM;
  342.     while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
  343.     {
  344.                 if (count == nCamID)
  345.                 {
  346.                         IPropertyBag *pBag=0;
  347.                         hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
  348.                         if(SUCCEEDED(hr))
  349.                         {
  350.                                 VARIANT var;
  351.                                 var.vt = VT_BSTR;
  352.                                 hr = pBag->Read(L"FriendlyName", &var, NULL); //还有其他属性,像描述信息等等...
  353.                     if(hr == NOERROR)
  354.                         {
  355.                                 //获取设备名称                       
  356.                                         WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,sName, nBufferSize ,"",NULL);

  357.                         SysFreeString(var.bstrVal);                               
  358.                         }
  359.                             pBag->Release();
  360.                         }
  361.                         pM->Release();

  362.                         break;
  363.                 }
  364.                 count++;
  365.     }

  366.         pCreateDevEnum = NULL;
  367.         pEm = NULL;

  368.         return 1;
  369. }
复制代码
  1. //////////////////////////////////////////////////////////////////////
  2. // Video Capture using DirectShow
  3. // Author: Shiqi Yu ([email protected])
  4. // Thanks to:
  5. //                HardyAI@OpenCV China
  6. //                flymanbox@OpenCV China (for his contribution to function CameraName, and frame width/height setting)
  7. // Last modification: April 9, 2009
  8. //
  9. // 使用说明:
  10. //   1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
  11. //   2. 菜单 Project->Settings->Settings for:(All configurations)->C/C++->Category(Preprocessor)->Additional include directories
  12. //      设置为 DirectShow/Include
  13. //   3. 菜单 Project->Settings->Settings for:(All configurations)->Link->Category(Input)->Additional library directories
  14. //      设置为 DirectShow/Lib
  15. //////////////////////////////////////////////////////////////////////

  16. #ifndef CCAMERA_H
  17. #define CCAMERA_H

  18. #define WIN32_LEAN_AND_MEAN

  19. #include <atlbase.h>

  20. #include "qedit.h"
  21. #include "dshow.h"

  22. #include <windows.h>
  23. #include <cxcore.h>

  24. #define MYFREEMEDIATYPE(mt)        {if ((mt).cbFormat != 0)                \
  25.                                         {CoTaskMemFree((PVOID)(mt).pbFormat);        \
  26.                                         (mt).cbFormat = 0;                                                \
  27.                                         (mt).pbFormat = NULL;                                        \
  28.                                 }                                                                                        \
  29.                                 if ((mt).pUnk != NULL)                                                \
  30.                                 {                                                                                        \
  31.                                         (mt).pUnk->Release();                                        \
  32.                                         (mt).pUnk = NULL;                                                \
  33.                                 }}                                                                       

  34. class CCameraDS  
  35. {
  36. private:

  37.         bool m_bConnected, m_bLock, m_bChanged;

  38.         int m_nWidth, m_nHeight;

  39.         long m_nBufferSize;

  40.         IplImage *m_pFrame;

  41.         CComPtr<IGraphBuilder> m_pGraph;

  42.         CComPtr<ISampleGrabber> m_pSampleGrabber;

  43.         CComPtr<IMediaControl> m_pMediaControl;

  44.         CComPtr<IMediaEvent> m_pMediaEvent;

  45.         CComPtr<IBaseFilter> m_pSampleGrabberFilter;
  46.         CComPtr<IBaseFilter> m_pDeviceFilter;
  47.         CComPtr<IBaseFilter> m_pNullFilter;

  48.         CComPtr<IPin> m_pGrabberInput;
  49.         CComPtr<IPin> m_pGrabberOutput;
  50.         CComPtr<IPin> m_pCameraOutput;
  51.         CComPtr<IPin> m_pNullInputPin;

  52.         bool BindFilter(int nCamIDX, IBaseFilter **pFilter);

  53.         void SetCrossBar();

  54. public:

  55.         CCameraDS();
  56.         virtual ~CCameraDS();

  57.         //打开摄像头,nCamID指定打开哪个摄像头,取值可以为0,1,2,...
  58.         //bDisplayProperties指示是否自动弹出摄像头属性页
  59.         //nWidth和nHeight设置的摄像头的宽和高,如果摄像头不支持所设定的宽度和高度,则返回false
  60.         bool OpenCamera(int nCamID, bool bDisplayProperties = true, int nWidth = 320, int nHeight = 240);

  61.         //关闭摄像头,析构函数会自动调用这个函数
  62.         void CloseCamera();

  63.         //返回摄像头的数目
  64.         //可以不用创建CCameraDS实例,采用int c=CCameraDS::CameraCount();得到结果。
  65.         static int CameraCount();

  66.         //根据摄像头的编号返回摄像头的名字
  67.         //nCamID: 摄像头编号
  68.         //sName: 用于存放摄像头名字的数组
  69.         //nBufferSize: sName的大小
  70.         //可以不用创建CCameraDS实例,采用CCameraDS::CameraName();得到结果。
  71.         static int CameraName(int nCamID, char* sName, int nBufferSize);

  72.         //返回图像宽度
  73.         int GetWidth(){return m_nWidth;}

  74.         //返回图像高度
  75.         int GetHeight(){return m_nHeight;}

  76.         //抓取一帧,返回的IplImage不可手动释放!
  77.         //返回图像数据的为RGB模式的Top-down(第一个字节为左上角像素),即IplImage::origin=0(IPL_ORIGIN_TL)
  78.         IplImage * QueryFrame();
  79. };

  80. #endif
复制代码
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-18 07:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表