目前我用了3种方式来获取影音文件的播放时长:
第一种:
[DllImport("Kernel32", CharSet = CharSet.Auto)]
        static extern int GetShortPathName(String path, StringBuilder shortPath, int shortPathLength);        [DllImport("winmm.dll", EntryPoint="mciSendString", CharSet = CharSet.Auto)]
        public static extern int mciSendString(string m_strCmd, StringBuilder m_strReceive, int m_v1, int m_v2);/// <summary>
        /// 得到播放时间,这个地方有点难,我研究了半天,呵呵!
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns></returns>
        private string getasfTime(string filePath)
        {
            StringBuilder shortpath = new StringBuilder(80);
            GetShortPathName(filePath, shortpath, shortpath.Capacity);
            string name = shortpath.ToString();
            StringBuilder buf = new StringBuilder(80);
            mciSendString("close all", buf, buf.Capacity, 0);
            mciSendString("open " + name + " alias media", buf, buf.Capacity, 0);            mciSendString("status media length", buf, buf.Capacity, 0);
            TimeSpan ts = new TimeSpan(0, 0, 0, 0, (int)Convert.ToDouble(buf.ToString().Trim()));
            return ts.ToString();
        }只能获取wmv、AVI、mpg这3中文件的时长。第二种:
/// <summary>
        /// 获取媒体播放时间长度,格式00:00:00。
        /// </summary>
        /// <param name="path">媒体路径</param>
        /// <returns>播放时间长度</returns>
        public static string getmediaduration(string path)
        {
            try
            {
                //axWindowsMediaPlayer1.URL = @"D:\DMS\Clouds.wmv";
                //string ss = axWindowsMediaPlayer1.currentMedia.duration.ToString();                Shell32.Shell shell = new Shell32.Shell();
                string str = path.Substring(0, path.LastIndexOf(@"\"));
                Shell32.Folder folder = shell.NameSpace(str);
                str = path.Substring(path.LastIndexOf(@"\") + 1);
                Shell32.FolderItem folderitem = folder.ParseName(str);
                str = folder.GetDetailsOf(folderitem, 21);
                return str;
            }
            catch (Exception ex)
            {
                ex.ToString();
                return null;
            }
        }只能获取wmv、AVI这2中文件的时长。第3种:
string uu = axWindowsMediaPlayer1.newMedia(@"D:\DMS\2011Z12Z319X09X5816.mpg").durationString;
只能获取到wmv这1种文件的时长。请问有没有什么方法能获取到:wmv、AVI、mpg、mkv、trp、ts、mov、rmvb等等文件的播放时长?

解决方案 »

  1.   

    用Windows Media  Player控件,以及用API 中的mciSendString函数,以及用Windows的shell32外壳都不能获取任何类型的音频或视频的播放时长,比如用WMP控件,打开rmvb类型的文件会导致异常,导致程序中断强制关闭退出,用mciSendString函数也是,shell32外壳取得的某些媒体的播放时长为空值
      

  2.   

    事实上没有通吃的办法,只能通过多种手段并行,尽力为之,留好退路
    如果实在需要精益求精,也不是不可以,解析各格式的Heaader即可