none
Shell32在windows8.1及其windows10中获取视频帧宽度 RRS feed

  • 问题

  •  

    在windows7下我使用下面的代码获取视频的帧高度和宽度

    Shell32.ShellClass sh = new Shell32.ShellClass();

    Shell32.Folder dir = sh.NameSpace(Path.GetDirectoryName(path));

    Shell32.FolderItem item = dir.ParseName(Path.GetFileName(path));

    string  videoWidth=dir.GetDetailsOf(item, 285);

    string videoHeight=dir.GetDetailsOf(item, 283);

    或者

                    Dictionary<string, string> dic = new Dictionary<string, string>();
                    int i = 0;
                    while (true)
                    {
                        //获取属性名称  
                        string key = dir.GetDetailsOf(null, i);
                        if (string.IsNullOrEmpty(key))
                        {
                            //当无属性可取时,退出循环  
                            break;
                        }
                        //获取属性值  
                        string value = dir.GetDetailsOf(item, i);
                        dic.Add(key, value);
                        DeveloperLogger.Debug(i + "__" + key + "___" + value);
                        i++;
                    }

    以上两种都在windows7下都可以获取到视频的帧宽度和帧高度,但在Windows8.1和Windows10中就无法获取了?

    请问在Windows8.1和Windows10应该怎样获取?

    2017年6月8日 10:22

答案

  • Hi,

    很高兴您能够回复邮件,非常感谢你的帮助。我之前发的代码在运行的时候需要手动的引用系统内部shell32.dll文件才可以使用。

    我的项目是在wpf中的但是您所说的MediaElement类方法获取是不是需要播放视频才可以获取到视频的高度和宽度,我在后台直接绑定好像获取不到,还有一个问题MediaElement类如果需要播放才能获取到高度和宽度,就有问题我的列表里面有很多不同类型的视频一次性加载处理就需要显示视频的高度和宽度,如果一个个的加载播放会影响程序的性能。不知道我使用的对不对,如果你那里有好的方法麻烦分享下。非常感谢你的回答。

     谢谢以上各位的答复问题已经解决了使用MediaInfo.dll调用

     MediaInfo MI = new MediaInfo();
                    MI.Open(path);
                    int width = Convert.ToInt32(MI.Get(StreamKind.Video, 0, "Width"));//视频width
                    int height = Convert.ToInt32(MI.Get(StreamKind.Video, 0, "Height"));
                    MI.Close();

    • 已标记为答案 Max_Zhang 2017年6月13日 6:32
    • 已编辑 Max_Zhang 2017年6月13日 6:33
    2017年6月13日 1:41

全部回复

  • Hi Max_Zhang,

    本论坛是讨论关于VB 语法,编译器,VB构架/运行时,包括语法关键字和自定义的命名空间。由于你问题的语法是有关C#的。所以我把它移到C#论坛,这样你会获得更专业的帮助,请参照以下链接:https://social.msdn.microsoft.com/forums/zh-cn/home?forum=visualcshartzhchs&filter=alltypes&sort=lastpostdesc

    感谢您的参与和支持。

    Best Regards,

    Cherry



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年6月9日 1:34
  •  没太注意  着急提问题了  谢谢了
    2017年6月9日 2:06
  • Hi,

    感谢你在MSDN论坛发帖。

    >>"请问在Windows8.1和Windows10应该怎样获取?"

    你有尝试使用UWP的工程来获取视频的长和宽吗? 使用 using Windows.Media.MediaProperties; 这个类库就可以。

    public uint Width
        {
            get
            {
                if (_properties is ImageEncodingProperties)
                {
                    return (_properties as ImageEncodingProperties).Width;
                }
                else if (_properties is VideoEncodingProperties)
                {
                    return (_properties as VideoEncodingProperties).Width;
                }
    
                return 0;
            }
        }
    
        public uint Height
        {
            get
            {
                if (_properties is ImageEncodingProperties)
                {
                    return (_properties as ImageEncodingProperties).Height;
                }
                else if (_properties is VideoEncodingProperties)
                {
                    return (_properties as VideoEncodingProperties).Height;
                }
    
                return 0;
            }
        }
    
    

    关于上面代码的详细信息,可以参考这个链接:

    https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/set-media-encoding-properties

    >>"以上两种都在windows7下都可以获取到视频的帧宽度和帧高度,但在Windows8.1和Windows10中就无法获取了?  "

    你能提供一份可以重现的demo吗? 这样我就可以测试一下,是不是windows 10的问题。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年6月9日 8:13
    版主
  • Hi:

    很高兴得看到您的回复,您上面所说的using Windows.Media.MediaProperties; 我在项目中引用不到(C# winfrom项目及WPF项目)。

    下面给的方法可以直接放在C#项目中,传递一个视频地址就可以看到返回结果了。麻烦您有时间可以试一下。非常感谢!

    public string GetMediaTimeLen(string path)
            {
                try
                {
                    //初始化Shell接口  
                    Shell32.ShellClass sh = new Shell32.ShellClass();
                    //获取文件所在父目录对象  
                    Shell32.Folder dir = sh.NameSpace(Path.GetDirectoryName(path));
                    //获取文件对象的FolderItem对象  
                    Shell32.FolderItem item = dir.ParseName(Path.GetFileName(path));
                    #region
                    ////字典存放属性名和属性值  
                    //Dictionary<string, string> dic = new Dictionary<string, string>();
                    ////循环获取详细信息  
                    //int i = 0;
                    //while (true)
                    //{
                    //    //获取属性名称  
                    //    string key = dir.GetDetailsOf(null, i);
                    //    if (string.IsNullOrEmpty(key))
                    //    {
                    //        //当无属性可取时,退出循环  
                    //        break;
                    //    }
                    //    //获取属性值  
                    //    string value = dir.GetDetailsOf(item, i);
                    //    dic.Add(key, value);
                    //    DeveloperLogger.Debug(i + "__" + key + "___" + value);
                    //    i++;
                    //}
                    #endregion
                    return dir.GetDetailsOf(item, 285) + " x " + dir.GetDetailsOf(item, 283);
                }
                catch (Exception e)
                {
                    DeveloperLogger.ErrorException("Gets the video frame width and height", e);
                    return null;
                }
            }

    2017年6月9日 9:04
  • Hi,

    我测试你的代码,在windows form工程里面,但是Shell32这个类,编译器没有找到,是不是少了什么类库?

    如果你在WPF中,想获取视频的高度,我建议你使用这个类。MediaElement

    这个类中有个NaturalVideoHeight 属性可以获取视频的高度。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年6月12日 8:22
    版主
  • Hi,

    很高兴您能够回复邮件,非常感谢你的帮助。我之前发的代码在运行的时候需要手动的引用系统内部shell32.dll文件才可以使用。

    我的项目是在wpf中的但是您所说的MediaElement类方法获取是不是需要播放视频才可以获取到视频的高度和宽度,我在后台直接绑定好像获取不到,还有一个问题MediaElement类如果需要播放才能获取到高度和宽度,就有问题我的列表里面有很多不同类型的视频一次性加载处理就需要显示视频的高度和宽度,如果一个个的加载播放会影响程序的性能。不知道我使用的对不对,如果你那里有好的方法麻烦分享下。非常感谢你的回答。

     谢谢以上各位的答复问题已经解决了使用MediaInfo.dll调用

     MediaInfo MI = new MediaInfo();
                    MI.Open(path);
                    int width = Convert.ToInt32(MI.Get(StreamKind.Video, 0, "Width"));//视频width
                    int height = Convert.ToInt32(MI.Get(StreamKind.Video, 0, "Height"));
                    MI.Close();

    • 已标记为答案 Max_Zhang 2017年6月13日 6:32
    • 已编辑 Max_Zhang 2017年6月13日 6:33
    2017年6月13日 1:41