如何在C#中获取MP3的长度

是的,这是这个问题的完全重复,但给出和接受作为答案的链接对我不起作用。 它返回不正确的值(2分钟mp3将被列为1’30,3分钟为2’20),没有明显的模式。

所以这又是:我如何使用C#获取MP3的长度?

要么

我对MP3Header类做错了什么 :

MP3Header mp3hdr = new MP3Header(); bool boolIsMP3 = mp3hdr.ReadMP3Information("1.mp3"); if(boolIsMP3) Response.Write(mp3hdr.intLength); 

显然,这个类使用fileSize / bitRate计算持续时间。 这只能用于恒定比特率,我假设你的MP3有可变比特率…

编辑:看看TagLib夏普 ,它可以给你持续时间

你如何确定“错误”的MP3的长度? 我经常发现标题信息可能是错误的:例如,有一个特定版本的LAME存在此问题。

如果您在Windows资源管理器中启用文件的属性,那么它显示了什么?

我包装了mp3解码器库,并为.net开发人员提供了它。 你可以在这里找到它:

http://sourceforge.net/projects/mpg123net/

包括将mp3文件转换为PCM的示例,以及读取ID3标签。

我想你可以用它来读取mp3文件的持续时间。 最糟糕的情况是你读取所有帧并计算持续时间–VBR文件。

要准确确定mp3持续时间,您必须读取所有帧并从其总计持续时间计算持续时间。 当人们在mp3文件中放入各种“元数据”时,有很多情况,所以如果从比特率和文件大小进行估算,你会猜错了。

我会考虑使用外部应用程序来执行此操作。 考虑尝试使用Sox并运行使用soxi(无exe)执行的程序版本并尝试解析该输出。 考虑到你的选择,我认为你最好只相信那些花时间解决mp3文件中所有奇怪问题的人,除非这个function是你正在做的事情的核心。 祝好运!

该主题中的第二篇文章可能会对您有所帮助: http : //social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/c72033c2-c392-4e0e-9993-1f8991acb2fd

无法估计VBR文件的长度。 其中的每个mp3帧可能具有不同的比特率,因此从阅读文件的任何部分您无法知道文件的任何其他部分的数据密度。 确定VBR mp3的EXACT长度的唯一方法是整体解码它,或者(如果你知道的话)逐个读取帧的所有标题,并收集它们的解码DURATION。

仅当您使用的CPU是您需要保存的宝贵资源时,才会使用以后的方法。 否则,解码整个文件,你将有持续时间。

您可以使用我的mpg123端口来完成这项工作: http : //sourceforge.net/projects/mpg123net/

更多:许多mp3文件添加了“东西”,作为id3标签,如果你没有浏览所有文件,你可能会错误地在持续时间计算中使用该标签。

有我的解决方案C#与sox声音处理库。

 public static double GetAudioDuration(string soxPath, string audioPath) { double duration = 0; var startInfo = new ProcessStartInfo(soxPath, string.Format("\"{0}\" -n stat", audioPath)); startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; startInfo.RedirectStandardError = true; startInfo.RedirectStandardOutput = true; var process = Process.Start(startInfo); process.WaitForExit(); string str; using (var outputThread = process.StandardError) str = outputThread.ReadToEnd(); if (string.IsNullOrEmpty(str)) using (var outputThread = process.StandardOutput) str = outputThread.ReadToEnd(); try { string[] lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); string lengthLine = lines.First(line => line.Contains("Length (seconds)")); duration = double.Parse(lengthLine.Split(':')[1]); } catch (Exception ex) { } return duration; }