如何更改DirectShow视频的亮度

本文关键字:亮度 视频 DirectShow 何更改 | 更新日期: 2023-09-27 18:28:09

首先,让我说我对DirectShow几乎一无所知。但我的任务是调整从帧捕获卡捕获的视频的亮度。

我正在使用DirectShow.NET和WPFMediaKit,所以这就是我获得视频的方式:

DirectShowLib.DsDevice[] allDevices = WPFMediaKit.DirectShow.Controls.MultimediaUtil.VideoInputDevices;
DirectShowLib.DsDevice dev = allDevices.ElementAt(0);

这就是我调整亮度的方法:

//Get the IAMVideoProcAmp
object o;
Guid IID_IBaseFilter = new Guid("56a86895-0ad4-11ce-b03a-0020af0ba770");
dev.Mon.BindToObject(null, null, ref IID_IBaseFilter, out o);
DirectShowLib.IAMVideoProcAmp vpa = (DirectShowLib.IAMVideoProcAmp)o;
//Get the flags
int pMin, pMax, pSteppingDelta, pDefault, pCurrent;
DirectShowLib.VideoProcAmpFlags pFlags;
vpa.GetRange(DirectShowLib.VideoProcAmpProperty.Brightness, out pMin, out pMax, out pSteppingDelta, out pDefault, out pFlags);
vpa.Get(DirectShowLib.VideoProcAmpProperty.Brightness, out pCurrent, out pFlags);
//Set the slider                
brightnessSlider.Maximum = pMax;
brightnessSlider.Minimum = pMin;
brightnessSlider.Value = pCurrent;

该代码确实适用于我的网络摄像头。然而,当我尝试在来自帧捕获卡的视频上执行此操作时,它显示以下错误:

Unable to cast COM object of type 'System.__ComObject' to interface type 'DirectShowLib.IAMVideoProcAmp'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{C6E13360-30AC-11D0-A18C-00A0C9118956}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

在这一行:

DirectShowLib.IAMVideoProcAmp vpa = (DirectShowLib.IAMVideoProcAmp)o;

你知道如何修复它或调整来自帧采集卡的视频的亮度吗?

如何更改DirectShow视频的亮度

有两种方法可以改变亮度:

  1. 视频采集卡等实时源可能支持IAMVideoProcAmp接口,可能支持亮度调整,然后如果您同时具备这两种功能,则可以控制正在采集的视频的亮度
  2. 流媒体管道可能具有解码器/效果过滤器,其改变通过的视频的亮度;特别是库存颜色控制变换DSP能够完成该任务。您当然应该在构建图时将其添加到拓扑中,然后分别更新其属性。这种方法不要求输入或输出设备具有特殊的亮度能力