如题,谢谢

解决方案 »

  1.   

    由于需要用到实时读取影音文件(mp3、wma、wmv …)播放时间长度的功能,搜索到的结果有:  (1)   硬编码分析影音文件,需要分析各种媒体格式,代价最大;  (2)   使用wmlib sdk,需要熟悉sdk各个接口,且不同版本的wm接口有别,代价次之;  (3)   使用系统shell32的com接口,直接访问媒体文体属性,取其特定内容,代价最小。  显然第3种方案见效最快,立即操刀:  ①   引用shell32底层接口c:windowssystem32shell32.dll,vs自动转换成interop.shell32.dll(注:64位系统和32位系统生成的interop.shell32.dll不一样)  ②   编码读取播放时间长度:
            /// <summary>
            /// 获取媒体播放时间长度,格式00:00:00。
            /// </summary>
            /// <param name="path">媒体路径</param>
            /// <returns>播放时间长度</returns>
            public static string getmediaduration(this string path)
            {
                try
                {
                    shell32.shell shell = new shell32.shellclass();
                    shell32.folder folder = shell.namespace(path.substring(0, path.lastindexof("\")));
                    shell32.folderitem folderitem = folder.parsename(path.substring(path.lastindexof("\") + 1));
                    return folder.getdetailsof(folderitem, 21);
                }
                catch (exception ex)
                {
                    ex.error();
                    return null;
                }
            }  ③   调用结果,在win2003上应使用folder.getdetailsof(folderitem, 21) ,而在vista上应使用folder.getdetailsof(folderitem, 27) ,主要是因为不同系统下文件属性索引顺序不同造成。只要右键单击文件属性,能看到的媒体属性都能取到,可以换不同的索引值来取。如下所示,取出的时间长度是 00:03:52,目标完成。
      

  2.   

    偶记得FFMEPG中有相应方法的,mencoder也行,关注过一段时间,没太深入。
      

  3.   

    谢谢,不过针对的是F4V(MPEG4)格式的。SHELL无法读取的到