目前我用了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等等文件的播放时长?
第一种:
[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等等文件的播放时长?
如果实在需要精益求精,也不是不可以,解析各格式的Heaader即可