DirectShow -选择视频设备
DirectShow - Selecting video device
这是我能够按照MSND参考编写的代码:http://msdn.microsoft.com/en-us/library/dd407269 (v = vs.85) . aspx
#include <iostream>
#include <conio.h>
#include <dshow.h>
// Helper function for initializing ICaptureGraphBuilder2 and IGraphBuilder
// MSDN function: http://msdn.microsoft.com/en-us/library/dd373396(v=vs.85).aspx
// Arguments are passed by pointers
HRESULT InitCaptureGraphBuilder(ICaptureGraphBuilder2 **, IGraphBuilder **);
// Helper function for retriving an enumerator for a specified device category
// MSDN function: http://msdn.microsoft.com/en-us/library/dd377566(v=vs.85).aspx
// MSDN about moniker: http://msdn.microsoft.com/en-us/library/ms679705(v=vs.85).aspx
// MSDN about enumerator: http://msdn.microsoft.com/en-us/library/dd407292(v=vs.85).aspx
// You need to pass by reference the type of device a nd by pointer the IEnumMoniker
HRESULT EnumerateDevices(REFGUID, IEnumMoniker **);
// Helper function for preparing the output video file
// You need to pass by ponter ICaptureGraphBuilder2 and IBaseFilter
HRESULT PrepareOutputFile(ICaptureGraphBuilder2 **, IBaseFilter **);
int main()
{
ICaptureGraphBuilder2 *capture_graph = NULL;
IGraphBuilder *graph = NULL;
IEnumMoniker *device_enumerator;
IBaseFilter *capture_filter;
HRESULT hr;
hr = CoInitialize(NULL);
hr = InitCaptureGraphBuilder(&capture_graph, &graph);
hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &device_enumerator);
// hr = PrepareOutputFile(&capture_graph, &capture_filter);
// At the end:
// capture_graph->Release();
// graph->Release();
}
HRESULT InitCaptureGraphBuilder(ICaptureGraphBuilder2 **ppCapture_graph, IGraphBuilder **ppGraph)
{
if (!ppCapture_graph || !ppGraph) {
return E_POINTER;
}
ICaptureGraphBuilder2 *capture_graph = NULL;
IGraphBuilder *graph = NULL;
// Create the Capture Graph Builder
HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&capture_graph);
if (SUCCEEDED(hr)) {
// Create the Filter Graph Manager
hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&graph);
if (SUCCEEDED(hr)) {
// Initialize the Capture Graph Builder
capture_graph->SetFiltergraph(graph);
// Return both interface pointers to the caller
// !! The caller must release both interfaces !!
*ppCapture_graph = capture_graph;
*ppGraph = graph;
return S_OK;
} else {
capture_graph->Release();
}
}
// Failed
return hr;
}
HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppDevice_enumerator)
{
ICreateDevEnum *create_dev_enum;
// Create the System Device Enumerator
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&create_dev_enum));
if (SUCCEEDED(hr)) {
// Create an enumerator for the selected category
hr = create_dev_enum->CreateClassEnumerator(category, ppDevice_enumerator, 0);
if (hr == S_FALSE) {
// The category is empty. Treat as an error
hr = VFW_E_NOT_FOUND;
}
create_dev_enum->Release();
}
return hr;
}
现在我仍然不明白如何选择我想要的视频设备。使用EnumerateDevices()
函数,我返回枚举数(我认为一种带有所有设备的向量),但是我如何在PrepareOutputFile()
(我必须写)之前使用它?!
请参见在MSDN上选择捕获设备。你基本上是在做第一个代码片段所建议的。进一步看一下-它指导你下一步要做什么,特别是IMoniker::BindToObject
是让你过滤实例为你的捕获图的调用。
相关文章:
- 视频在唤醒其他线程时输入设备断开连接
- 如何选择waveIn/waveOut函数C++使用的输入/输出设备
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- 使用opencv在受控环境中进行视频跟踪的跟踪标记和跟踪算法选择
- 使用OpENCV中的两个视频仪捕获同一设备
- 将两个不同的设备捕获框架组合到一个框架中,然后写一个视频
- 您如何选择在opencv-dnn上执行操作的设备
- OPENCV视频关注设备索引 /设备编号
- 如何为 OpenCV 的视频编写器动态选择可用的编解码器?
- 如何从视频中选择两个帧?OPENCV C
- OPENCV是否可以使用视频捕获设备访问模拟摄像机
- 使用OpenCV C 从SMI Grabber设备捕获视频
- 从视频纹理中选择源矩形
- Blackmagic DirectShow Framerate - 为什么我没有获得我的捕获设备能够实现的所有视频模式
- CUDA 5.5 : 我不能在内核方法中使用"printf",我应该在 VisualStucio2010 "compute_xx,sm_xx" 中选择哪个设备?
- 在C++中选择录制设备 (Windows)
- C++使用视频数据和视频设备的优势
- 为 TCP 连接选择特定的以太网设备
- DirectShow -选择视频设备
- SDL应用程序使用DirectFB错误:没有可用的视频设备