使用directshow仅显示视频的小区域

时间:2012-03-29 11:51:11

标签: c# video directshow directshow.net

我在带有DirectShow的c#中有一个视频图。

现在我想用预览显示所有视频源。但它不应该将视频区域调整到面板的大小。

目前它向我展示了面板上的视频,但它会调整视频的大小与面板成比例。

我想在此面板中仅显示视频的单个区域。例如,这张图片:http://www.cnet.de/i/story_media/41557373/weitwinkel.jpg 如果这是我的视频,其上的最小区域将是我的面板的大小。我不希望在我的面板尺寸中放入整个视频,它只应显示视频的一小部分。

我的代码是:

//get the video window from the graph
IVideoWindow videoWindow2 = (IVideoWindow)_graph;

//Set the owner of the videoWindow to an IntPtr of some sort (the Handle of any control - could be a form / button etc.)
int hr = videoWindow2.put_Owner(panel.Handle);

面板属于Panel。

2 个答案:

答案 0 :(得分:2)

解决方案是使用IVideoWindow的SetWindowPosition。

//get the real video width
hr1 = videoWindow2.get_Width(out videoWidth);
DsError.ThrowExceptionForHR(hr1);

//get the real video height
hr1 = videoWindow2.get_Height(out videoHeight);
DsError.ThrowExceptionForHR(hr1);

//calculate the width when setting the height to the panel height
videoWidthF = (float)videoWidth;
videoHeightF = (float)videoHeight;
panelWidthF = (float)panelWidth;
panelHeightF = (float)panelHeight;

// calculate the margins
int margin = (int)(((panelHeightF / videoHeightF*videoWidthF) - panelWidthF) / 2);

// Position video window in client rect of main application window
hr1 = videoWindow2.SetWindowPosition(-margin, 0, (int)(panelHeightF / videoHeightF * videoWidthF), panel.Height);

答案 1 :(得分:1)

看一下使用VMR的无窗口模式。 IVMRWindowlessControl9 :: SetVideoPosition正是您所寻找的。快速谷歌搜索将提供样本。