视频的宽高比在一台计算机上维护,而不是用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
变量。因此,我尝试了IVMRAspectRatioControl
和VMR-7
,它在一台计算机上工作。尽管调用了取消长宽比保存,另一台计算机仍保持在"信箱"模式。
EDIT #3:下面是使用IVMRAspectRatioControl
和VMR-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);
我不完全确定它是如何工作的,但有可能第二台计算机不支持IVMRAspectRatioControl
的VMR-7
吗?两台计算机上的操作系统是相同的,但是第一台计算机(可以工作)是我编写软件的地方(它有IDE)。第二台计算机安装了新的Windows
。在第二台计算机上,我也更新了DirectX
,如前所述。
视频渲染器可以配置为保留或不保留长宽比。配置方法(也许,默认设置,也可以取决于渲染器的内部模式,如覆盖/离屏表面)取决于您正在使用的视频渲染器版本,例如,对于VMR-7,您将使用IVMRWindowlessControl::SetAspectRatioMode
的(或者,如果您的VMR处于窗口模式,则使用IVMRAspectRatioControl::SetAspectRatioMode
) DirectShow。净当量/包装。VMR-9、EVR有类似的方法。
对于VMR-9,您将使用IVMRAspectRatioControl9::SetAspectRatioMode
。EVR是IMFVideoDisplayControl::SetAspectRatioMode
。
如果你不想要任何信箱和宽高比保存,你只需要在设置视频渲染器时显式地禁用它。