做显微镜视频抓图 厚道 发表于 2005-7-12 20:05:00
有以下几种方案: 1、vfw 老技术啦,实时性可能不好,但是编辑能力超强。 2、mci Media control interface 微软msdn上有不少介绍,通过发命令消息或者字符串消息的形势来调用硬件驱动程序来完成相应的操作,实时性好些。 3、directshow 技术,包括direct sound and direct draw,通用性好,速度快,基于com模型。 4、利用采集卡自带的sdk,最简单的喽^&^ 5、呵呵 可以利用opencv,里面有专门做采集卡的抓图的类,不过需要一段时间上手。
我对direct 中com模型的理解:
说白了就是对像的一个封装,而且是很好的封装,这样我们用的时候只要知道一个filter的接口,就可以去用啦,Filter graph manager 根据你给出的文件的扩展名来建立filter gragh,这样我们通过其render filter就可以实现多媒体文件的播放啦,下面是个简单的例子(vc中新建控制台工程,拷入代码即可运行):
#i nclude "stdafx.h" #i nclude <dshow.h> #i nclude <stdio.h> #pragma comment (lib,"winmm.lib") #pragma comment (lib,"strmbase.lib") int main(int argc, char* argv[]) { IGraphBuilder *pGraph = NULL; IMediaControl *pControl = NULL; IMediaEvent *pEvent = NULL;
// Initialize the COM library. HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { printf("ERROR - Could not initialize COM library"); return 0; }
// Create the filter graph manager and query for interfaces. hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); if (FAILED(hr)) { printf("ERROR - Could not create the Filter Graph Manager."); return 0; }
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// Build the graph. IMPORTANT: Change this string to a file on your system. hr = pGraph->RenderFile(L"D:\\movie\\sucer.avi", NULL); if (SUCCEEDED(hr)) { // Run the graph. hr = pControl->Run(); if (SUCCEEDED(hr)) { // Wait for completion. long evCode; pEvent->WaitForCompletion(INFINITE, &evCode);
// Note: Do not use INFINITE in a real application, because it // can block indefinitely. } } pControl->Release(); pEvent->Release(); pGraph->Release(); CoUninitialize();
return 0;
} |