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

Project1

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

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

  [复制链接]

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

51
发表于 2011-4-21 21:58:19 | 只看该作者
本帖最后由 yangff 于 2011-4-21 21:58 编辑
zh99998 发表于 2010-11-27 14:47
独占模式:


异步什么的开个线程自动释放吧……再加个Proc什么的……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
52
发表于 2011-4-21 22:06:29 | 只看该作者
异步的写法感觉是给会写点点脚本的人准备的. 个人感觉.

Ruby 的多线程有点感觉.......

不过, Ruby 多线程怎么写?  忘记了.

咱等下更新下好了.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5724
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
53
发表于 2011-4-21 22:58:26 | 只看该作者
回复 蕾米莉亚·斯卡雷特 的帖子

这样?Thread.new{loop{影片.update;sleep(1/Graphics.frame_rate)}}

于是有关详细Ruby的线程(Thread)的操作送上:
http://www.kuqin.com/rubycndocum ... _object_thread.html

实际上我还真没试过这个RM播放器呢~
还有就是Flash不是必须安装FlashPlayer的吗?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
54
发表于 2011-4-21 23:13:52 | 只看该作者
回复 一箭烂YiJL 的帖子

不是必须的, 安装了 FlashXX.ocx 的 ActiveX 控件就可以了~~

点评

这个没研究= =  发表于 2011-4-21 23:40
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
105 小时
注册时间
2009-7-25
帖子
201
55
发表于 2011-4-22 00:21:39 | 只看该作者
全屏播放AVI闪屏,播放范例的却正常,不知道是何原因

点评

VX闪屏,有时候跟显卡硬件加速有关,硬件+速选择 “无”,暂时能解决  发表于 2011-4-22 11:32
我是好人

VX ARPG迷城的国度试玩版已经放出
后续版本紧张制作中

正在策划迷城的伊苏:以超难迷宫为主的中型游戏
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2011-1-12
帖子
42
56
发表于 2011-4-22 11:25:54 | 只看该作者
回复 killkill2298 的帖子

目前脚本是使用自动链接到合适的解码链的, 但是自动的代价就是不是最优的.

而且 AVI 的编码很多. 所以请查看一下您所使用的 AVI视频 的编码格式, 方便的话请告诉我(最好是有这个格式的视频文件给我), 我帮你找一下合适的解码库~~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
105 小时
注册时间
2009-7-25
帖子
201
57
发表于 2011-4-22 15:15:34 | 只看该作者
本帖最后由 killkill2298 于 2011-4-22 15:22 编辑

在WMP中查看信息:

视频长度 03:53
比特率 - (估计无法识别)
音频解码器:- (我这视频本来就没声音)
视频解码器: MPEG Video Decoder

是在这里看么?

点评

主要是看视频的 编码 格式 解码器什么的, 脚本会解决。 格式需要的解码器没有找到话,视频就不能播放  发表于 2011-4-22 22:38
我是好人

VX ARPG迷城的国度试玩版已经放出
后续版本紧张制作中

正在策划迷城的伊苏:以超难迷宫为主的中型游戏
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

58
发表于 2011-4-22 17:43:20 | 只看该作者
蕾米莉亚·斯卡雷特 发表于 2011-4-21 23:13
回复 一箭烂YiJL 的帖子

不是必须的, 安装了 FlashXX.ocx 的 ActiveX 控件就可以了~~ ...

话说视屏是怎么显示的?DD?解码器返回的是什么?是Bitmap矩阵么?如果是的话可以考虑用61的那个获取Bitmap内存地址的方法把视屏嵌到Bitmap里面,这样就不会挡住别的东西了……
解码什么的不是很熟&……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

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

核心是 DirectShow , 解码链 返回的是 IPin 接口。 显示啥的, 是框架问题。 不是 Bitmap 就是了。
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

60
发表于 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-12-23 07:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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