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 ---