c# asp.net获取音频时长及音频转码
2017-10-27 21:04
537 查看
c# asp.net获取音频时长及音频转码
直接上代码并见注释
/// <summary> /// 利用ShellClass获取音频文件时长; /// 如果添加引用编译提示"不能引用嵌入式接口之类的错误",把引用属性里的嵌入式***,设为false; /// asp.net 环境下测试未通过,c#未测试; /// </summary> /// <param name="filePath">文件路径</param> /// <returns></returns> private int GetDurationByShellClass(string filePath) { try { ShellClass sh = new ShellClass(); Folder dir = sh.NameSpace(Path.GetDirectoryName(filePath)); FolderItem item = dir.ParseName(Path.GetFileName(filePath)); string str = dir.GetDetailsOf(item, 27); // 获取歌曲时长。 if (str != "") { var matchs = Regex.Match(str, @"(\d{2}):(\d{2}):(\d{2})"); var hour = Convert.ToInt32(matchs.Groups[1].Value); var minute = Convert.ToInt32(matchs.Groups[2].Value); var second = Convert.ToInt32(matchs.Groups[3].Value); var len = hour * 3600 + minute * 60 + second; return len; } else { return 0; } } catch (Exception ex) { Console.WriteLine(ex.Message); } return 0; } /// <summary> /// 利用WMPLib获取音频文件时长; /// 如果添加引用编译提示"不能引用嵌入式接口之类的错误",把引用属性里的嵌入式***,设为false; /// asp.net 环境下测试未通过,c#未测试; /// </summary> /// <param name="filePath"></param> /// <returns></returns> private int GetDurationByWMPLib(string filePath) { try { WMPLib.WindowsMediaPlayerClass player = new WMPLib.WindowsMediaPlayerClass(); player.URL = filePath; var duration = Math.Ceiling(player.duration); } catch (Exception ex) { Console.WriteLine(ex.Message); } return 0; } /// <summary> /// 利用MediaInfoDotNet获取音频文件时长 /// 如果添加引用编译提示"不能引用嵌入式接口之类的错误",把引用属性里的嵌入式***,设为false; /// asp.net 环境下测试未通过,c#测试通过; /// </summary> /// <param name="filePath"></param> /// <returns></returns> private int GetDurationByMediaInfoDotNet(string filePath) { try { MediaInfoDotNet.MediaFile aviFile = new MediaInfoDotNet.MediaFile(filePath); if (aviFile.Audio.Count > 0) { var duration = aviFile.General.Duration; return duration; } } catch (Exception ex) { Console.WriteLine(ex.Message); } return 0; } [DllImport("Kernel32", CharSet = CharSet.Auto)] static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength); [DllImport("winmm.dll")] public static extern int mciSendString(string m_strCmd, StringBuilder m_strReceive, int m_v1, int m_v2); public static string MusicTime(string musicFilePath)//musicFilePath是歌曲文件地址 { if (File.Exists(musicFilePath))//是否存在这个文件 { //利用MCI命令,返回值为文件时间 StringBuilder shortpath = new StringBuilder(80); GetShortPathName(musicFilePath, shortpath, shortpath.Capacity); string musicname = shortpath.ToString(); StringBuilder buf = new StringBuilder(80); mciSendString("close all", buf, buf.Capacity, 0); mciSendString("open " + musicname + " alias media", buf, buf.Capacity, 0); mciSendString("status media length", buf, buf.Capacity, 0); //return buf.ToString().Trim(); double ms = Convert.ToDouble(buf.ToString().Trim()); TimeSpan ts = new TimeSpan(0, 0, 0, 0, (int)ms); return ts.ToString().Substring(3, 5);//这里你自己去决定返回的是什么格式 } return "0";//如果文件不存在就返回"0" } /// <summary> /// 利用ffmpeg获取指定文件的时长,单位:秒; /// 调用:var duration = GetDurationByffmpeg(filePath, @"/ffmpeg.exe"); /// </summary> /// <param name="fileName">文件路径</param> /// <param name="ffmpegVirtualPath">ffmpeg.exe的虚拟路径</param> /// <returns></returns> public static int GetDurationByffmpeg(string fileName, string ffmpegVirtualPath) { int duration = 0; try { if (!File.Exists(fileName)) { return 0; } using (System.Diagnostics.Process pro = new System.Diagnostics.Process()) { pro.StartInfo.UseShellExecute = false; pro.StartInfo.ErrorDialog = false; pro.StartInfo.RedirectStandardError = true; pro.StartInfo.FileName = System.Web.HttpContext.Current.Server.MapPath(ffmpegVirtualPath); // AppDomain.CurrentDomain.BaseDirectory +"ffmpeg.exe"; pro.StartInfo.Arguments = " -i " + fileName; pro.Start(); System.IO.StreamReader errorreader = pro.StandardError; pro.WaitForExit(1 * 1000); string result = errorreader.ReadToEnd(); if (!string.IsNullOrEmpty(result)) { result = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00").Length); var matchs = Regex.Match(result, @"(\d{2}):(\d{2}):(\d{2})"); var hour = Convert.ToInt32(matchs.Groups[1].Value); var minute = Convert.ToInt32(matchs.Groups[2].Value); var second = Convert.ToInt32(matchs.Groups[3].Value); var len = hour * 3600 + minute * 60 + second; duration = len; } return duration; } } catch (Exception ex) { log.Error(ex); } return 0; } /// <summary> /// 利用ffmpeg进行转码; 如 amr转mp3 /// </summary> /// <param name="inputFile">输入文件,要转码的文件</param> /// <param name="outputFile">转码后的文件</param> /// <param name="ffmpegVirtualPath">ffmpeg.exe的虚拟路径</param> /// <returns></returns> public static bool FromffmpegTurnCode(string inputFile, string outputFile, string ffmpegVirtualPath) { try { if (!File.Exists(inputFile)) { return false; } using (System.Diagnostics.Process pro = new System.Diagnostics.Process()) { pro.StartInfo.UseShellExecute = false; pro.StartInfo.ErrorDialog = false; pro.StartInfo.RedirectStandardError = true; pro.StartInfo.FileName = System.Web.HttpContext.Current.Server.MapPath(ffmpegVirtualPath); // AppDomain.CurrentDomain.BaseDirectory +"ffmpeg.exe"; pro.StartInfo.Arguments = " -i " + inputFile + " -y " + outputFile; pro.Start(); System.IO.StreamReader errorreader = pro.StandardError; pro.WaitForExit(30 * 1000); return true; } } catch (Exception ex) { log.Error(ex); } return false; }
--- end ---
相关文章推荐
- C#获取类以及类下的方法(用于Asp.Net MVC)
- c# asp.net获取域名whois信息
- ASP.NET获取IP与MAC[using C#]
- C# ,asp.net 获取当前,相对,绝对路径
- ASP.NET C# 获取客户端及浏览器信息
- C# asp.net 在ajax调用的后台静态方法中获取Session
- 用asp.net(c#)获取网页源代码(两种方法)
- C#获取类以及类下的方法(用于Asp.Net MVC)
- 项目供参考Asp.net C# 获取本周上周本月上月本年上年第一天最后一天时间大全
- C#(ASP.Net)获取当前路径的方法集合
- C#、Asp.NET获取当前程序的路径
- ASP.Net 获取当前路径与C# 获取当前路径的不同
- C# 获取客户端信息 /asp.net/WebService/WebForm
- c#(asp.NET)获取文件路径
- C# ,asp.net 获取当前,相对,绝对路径(转)
- C#(ASP.Net)获取当前路径的方法集合
- asp.net c# 在一般处理程序中不能获取Session值
- asp.net(c#)获取内容第一张图片地址的函数
- 用asp.net c# 获取网页源代码
- C#、ASP.NET获取当前应用程序的绝对路径,获取程序工作路径(转)