视频的宽高比在一台计算机上维护,而不是用DirectShow维护另一台计算机

本文关键字:计算机 维护 一台 DirectShow 高比 视频 | 更新日期: 2023-09-27 18:08:54

我有一个使用DirectShowNet库播放视频的C#应用程序。当我在笔记本电脑上使用Visual c#调试我的应用程序时,视频被拉伸以适应容器的尺寸,即视频的宽高比没有保持。当我在不同的计算机(相同的操作系统)上加载和运行我的应用程序时,aspect ratio被维护并且在屏幕上创建了黑条。

不希望保持宽高比。我希望另一台电脑显示视频的方式与我的电脑显示视频的方式相同。

为什么你认为这两台电脑的行为不同和/或我如何解决这个问题?

当我第一次在另一台计算机上看到这种行为时,我更新了那台计算机的DirectX,但无济于事。在两个系统上运行完全相同的视频。

EDIT #1:可能是其他计算机上缺少filter吗?我假定DirectShow的默认行为是不维护Aspect Ratio

EDIT #2:当我试图使用IVMRWindowlessControl (VMR-7 &VMR-9),从VMR到IVMRWindowlessControl的强制转换继续导致NULL变量。因此,我尝试了IVMRAspectRatioControlVMR-7,它在一台计算机上工作。尽管调用了取消长宽比保存,另一台计算机仍保持在"信箱"模式。

EDIT #3:下面是使用IVMRAspectRatioControlVMR-7:

的代码
int hr = 0;
this.graphBuilder = (IGraphBuilder)new FilterGraph();
this.vmr = new VideoMixingRenderer();
this.graphBuilder.AddFilter((IBaseFilter)vmr, "VMR");
this.aspectRatioControl = (IVMRAspectRatioControl)this.vmr;
hr = this.aspectRatioControl.SetAspectRatioMode(VMRAspectRatioMode.None);
DsError.ThrowExceptionForHR(hr);
hr = this.graphBuilder.RenderFile(filename, null);
DsError.ThrowExceptionForHR(hr);  

然后我使用IVideoWindow来显示视频。

当试图使用IVMRWindowlessControl9时,this.windowlessControl在第4行上的cast之后求值为NULL。当我用VMR-7尝试时,我得到了相同的NULL错误。下面使用VMR-9:

this.graphBuilder = (IGraphBuilder)new FilterGraph();
this.vmr = new VideoMixingRenderer9();
this.graphBuilder.AddFilter((IBaseFilter)vmr, "VMR");
this.filterConfig = (IVMRFilterConfig9)vmr;
hr = this.filterConfig.SetNumberOfStreams(1);
DsError.ThrowExceptionForHR(hr); 
hr = this.filterConfig.SetRenderingMode(VMR9Mode.Windowless);
DsError.ThrowExceptionForHR(hr);  
this.windowlessControl = (IVMRWindowlessControl9)this.vmr;
hr = this.windowlessControl.SetAspectRatioMode(VMR9AspectRatioMode.None);
DsError.ThrowExceptionForHR(hr);
hr = this.graphBuilder.RenderFile(filename, null);
DsError.ThrowExceptionForHR(hr);  

我不完全确定它是如何工作的,但有可能第二台计算机不支持IVMRAspectRatioControlVMR-7吗?两台计算机上的操作系统是相同的,但是第一台计算机(可以工作)是我编写软件的地方(它有IDE)。第二台计算机安装了新的Windows。在第二台计算机上,我也更新了DirectX,如前所述。

视频的宽高比在一台计算机上维护,而不是用DirectShow维护另一台计算机

视频渲染器可以配置为保留或不保留长宽比。配置方法(也许,默认设置,也可以取决于渲染器的内部模式,如覆盖/离屏表面)取决于您正在使用的视频渲染器版本,例如,对于VMR-7,您将使用IVMRWindowlessControl::SetAspectRatioMode的(或者,如果您的VMR处于窗口模式,则使用IVMRAspectRatioControl::SetAspectRatioMode) DirectShow。净当量/包装。VMR-9、EVR有类似的方法。

对于VMR-9,您将使用IVMRAspectRatioControl9::SetAspectRatioMode。EVR是IMFVideoDisplayControl::SetAspectRatioMode

如果你不想要任何信箱和宽高比保存,你只需要在设置视频渲染器时显式地禁用它。