Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从shell元数据属性获取变形视频的显示大小_C#_Video_Windows Shell_Windows Api Code Pack_M4v - Fatal编程技术网

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

C# 从shell元数据属性获取变形视频的显示大小,c#,video,windows-shell,windows-api-code-pack,m4v,C#,Video,Windows Shell,Windows Api Code Pack,M4v,我正在使用Microsoft.WindowsAPICodePack.Shell.ShellFile从文件路径获取视频大小(宽度和高度) public Size GetVideoSize(string videoFullPath) { if (File.Exists(videoFullPath)) { ShellFile shellFile = ShellFile.FromFilePath(videoFullPath); int videoWidt

我正在使用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)。这就是所谓的。因此,720x480可能是视频的正确分辨率,但不是正确的显示大小

当在窗口中显示变形的宽屏时,视频播放器通常只是保持相同的高度并拉伸宽度以获得正确的显示纵横比。如果是全屏显示,则宽度和高度都可以拉伸,但拉伸系数不同,因此显示纵横比正确,视频完全符合屏幕分辨率

要获得显示大小(这似乎是您想要的),我们需要纵横比。幸运的是,用于获取帧宽度和高度的同一帧也具有纵横比属性,即和。虽然这是未记录的,但它们似乎是指像素纵横比,而不是图片显示纵横比。对于变形视频,您需要的是以下几点:

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;
在你的例子中,我期望的是水平方向=53,垂直方向=45(或者其他产生类似比率的值)

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

int roundingMultiple = 8;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
displayWidth = ((displayWidth - 1) / roundingMultiple + 1) * roundingMultiple;
这不是特定于mkv文件的;任何容器格式的任何变形视频文件都必须进行相同的处理


编辑:更改了上面的代码,以反映水平纵横比显然是像素纵横比的事实。

您可以尝试打开文件并提取元数据,分辨率可以保存在那里,你也可以用类似的方式获得分辨率。我无法想象如果你问的话,FFmpeg开源应用程序会吐出错误的信息。命令行工具FFmpeg.exe-i[文件路径]。也许可以将其导入到您的应用程序中?或者正在使用外部可执行的“否”选项。否则,您可能会在源代码中看到FFmpeg的方法……我怀疑这些数字是图像的实际大小(以像素为单位),而您期望的大小是使用非方形像素渲染图像的方式。@Mikedklerk:实际上,FFmpeg不起作用:(我试过了。@Melcletz:你能测试一下上面的解决方案,让我知道它是否对你有效吗?我觉得这正是你想要的,很难找到,我会感谢你的赏金。谢谢!谢谢你的尝试,Alex,我试过了代码,但它没有返回正确的大小…实际宽度是856.903761349,但是第一段代码之后,我得到571.26917712691773;第二段代码之后,我得到578.26917712691773。@Melcletz:啊,我明白了。水平纵横比和垂直纵横比显然包含像素纵横比,而不是显示纵横比;这不是文档中所说的,但只要稍作修改,它就可以正常工作,请参阅更新的代码在上面