【问题标题】:How to get the length of a MP3 in C#如何在 C# 中获取 MP3 的长度
【发布时间】:2010-11-15 21:20:12
【问题描述】:

是的,这是this question 的完全相同的副本,但是作为答案给出并接受的链接对我不起作用。它返回不正确的值(2 分钟的 mp3 将被列为 1'30,3 分钟将被列为 2'20),没有明显的模式。

所以又来了:如何使用 C# 获得 MP3 的长度?

MP3Header class 我做错了什么:

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

【问题讨论】:

标签: c# .net mp3 duration


【解决方案1】:

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

如果您在 Windows 资源管理器中打开文件的属性,会显示什么?

【讨论】:

  • 一个例子:MPEG Layer 3 音频,持续时间 1:29,比特率:128kbps,音频率:44kHz。该函数会找到类似 1:12 的持续时间。我将无法控制将上传到系统的 MP3 类型,因此无论编码/比特率/其他什么,我都需要它工作。
  • 在使用 taglib 进行测试后,我认为给我的 mp3 有点混乱或编码不同......我会解决这个问题(请参阅 Jon's 和 Thomas 上的其他 cmets '答案)
  • @marcgg:我个人认为你应该接受托马斯的回答,因为它更普遍有用。
  • @marcgg:您想要使用 mpg123 并确定 EXACT mp3 文件持续时间的代码示例吗?
【解决方案2】:

显然,此类使用 fileSize / bitRate 计算持续时间。这仅适用于恒定比特率,我假设您的 MP3 具有可变比特率...

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

【讨论】:

  • 它看起来像恒定比特率(请参阅我对乔恩答案的评论)。我该如何测试?
  • 关于您的编辑:taglib 可以获取持续时间吗?太好了,我马上去看看
  • 它只返回 0... 我猜我得到的文件编码很奇怪,这可以解释这一切。我想我会找到解决它的方法
  • TagLib Sharp 给我的结果大约是实际持续时间的 70%。
  • 现在几乎每个人都使用可变比特率来播放音乐
【解决方案3】:

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • sox 对于我正在尝试做的事情听起来有点矫枉过正,你不觉得吗?
    • 是的,但是如果它每次都有效,并且您可以继续生活,那不值得吗?
    • true :) 我想我会想办法解决的。所有这些都是要发送到 Flash 播放器,但我知道如何获取 Flash 中的持续时间,所以我可以在文件发送后弄清楚。感谢您的想法!
    【解决方案5】:

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

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

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

    我猜你可以用它来读取 mp3 文件的时长。最坏的情况是您读取所有帧并计算持续时间 - VBR 文件。

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

    【讨论】:

      【解决方案6】:

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

      只有当您使用的 CPU 是您需要节省的宝贵资源时,您才会使用稍后的方法。否则,解码整个文件,您将获得持续时间。

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

      更多:许多 mp3 文件都添加了“stuff”,作为 id3 标签,如果您不浏览所有文件,您可能会在计算时长时错误地使用该标签。

      【讨论】:

        【解决方案7】:

        我的 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-07
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多