gpt4 book ai didi

c# - 从 shell 元数据属性获取变形视频的显示大小

转载 作者:行者123 更新时间:2023-11-30 17:57:17 27 4
gpt4 key购买 nike

我正在使用 Microsoft.WindowsAPICodePack.Shell.ShellFile 从文件路径获取视频大小(宽度和高度)。

public Size GetVideoSize(string videoFullPath)
{
if (File.Exists(videoFullPath))
{
ShellFile shellFile = ShellFile.FromFilePath(videoFullPath);

int videoWidth = (int)shellFile.Properties.System.Video.FrameWidth.Value;
int videoHeight = (int)shellFile.Properties.System.Video.FrameHeight.Value;

return new Size(videoWidth, videoHeight);
}
return Size.Empty;
}

问题是此方法无法检索 m4v 文件的正确大小。你有什么建议吗?我可以使用什么来获得实际的宽度/高度?

示例:我有一个 m4v 视频,其实际大小为 856x480

  • 如果我在 Windows 资源管理器中查看文件的属性,大小是720x480(错误)
  • 如果我在视频播放器中打开视频,视频将呈现在正确的尺寸,即使视频细节仍然显示 720x480 的尺寸
  • 如果我在 WPF 的 MediaElement 控件中加载视频,我会通过 mediaElement.NaturalVideoWidth, mediaElement.NaturalVideoHeight 获得正确的大小,但问题是我需要在没有任何 WPF 引用的类库。

最佳答案

这里的关键提示是 856/480 = 1.78 大约等于 16/9 = 1.77,宽屏视频的常见纵横比。像素分辨率为 1:1.33 或 1:1.5(例如 640x480 或 720x480)的视频并不罕见,但要显示的宽高比为 1:1.77(例如856x480)。这叫做 Anamorphic Widescreen .所以 720x480 可能是视频的正确分辨率,但不是正确的显示尺寸

在窗口中显示变形宽屏时,视频播放器通常只是保持相同的高度并拉伸(stretch)宽度以获得正确的显示纵横比。如果是全屏,则宽度和高度都可能会被拉伸(stretch),但拉伸(stretch)比例不同,这样显示宽高比就会正确,并且视频完全适合屏幕分辨率。

要获得显示尺寸(这似乎是你想要的),我们需要纵横比。幸好一样metadata properties API你用来获取框架的宽度和高度也有宽高比属性,即System.Video.HorizontalAspectRatioSystem.Video.VerticalAspectRatio .虽然这没有记录,但这些似乎是指像素纵横比,而不是图片显示纵横比。您想要的变形视频遵循以下原则:

int videoWidth = (int)shellFile.Properties.System.Video.FrameWidth.Value;
int videoHeight = (int)shellFile.Properties.System.Video.FrameHeight.Value;
int horizontalAspect = (int)shellFile.Properties.System.Video.HorizontalAspectRatio.Value;
int verticalAspect = (int)shellFile.Properties.System.Video.VerticalAspectRatio.Value;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
int displayHeight = videoHeight;

在您的情况下,我希望 horizo​​ntalAspect = 53 和 verticalAspect = 45(或产生类似比率的其他值)。

显示分辨率可能会四舍五入到 16 或 8 像素的精确倍数,因此您可能还需要执行以下操作:

int roundingMultiple = 8;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
displayWidth = ((displayWidth - 1) / roundingMultiple + 1) * roundingMultiple;

这不是特定于 mkv 文件;任何容器格式的任何变形视频文件都必须以相同的方式处理。

编辑:更改上面的代码以反射(reflect) horizo​​ntalAspect/verticalAspect 显然是像素纵横比这一事实。

关于c# - 从 shell 元数据属性获取变形视频的显示大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com