【问题标题】:How to retrieve the correct Duration of an mp3 audio file in C#/.NET/DirectX?如何在 C#/.NET/DirectX 中检索 mp3 音频文件的正确持续时间?
【发布时间】:2012-06-23 00:49:37
【问题描述】:

我正在编写一个媒体演示程序,我几乎完成了,但由于某种原因,我得到的 mp3 文件的持续时间不正确。我使用 Microsoft.DirectX.AudioVideoPlayback.Audio 类播放音频文件,它适用于 wav 文件。从谷歌搜索中,我可以看出当 mp3 使用可变比特率编码时似乎是一个问题,但是无论媒体的比特率设置如何,我都需要我的程序准确报告。代码如下:

Media_Audio aud = (Media_Audio)item.MediaFile;
TimeSpan total = aud.EndTime - aud.StartTime;
if (aud.EndTime.TotalSeconds == 0)
{
    total = TimeSpan.FromSeconds(aud.Player.Duration)-aud.StartTime;
}
TimeSpan now = TimeSpan.FromSeconds(aud.Player.CurrentPosition) - aud.StartTime;
string nows = now.Hours.ToString() + ":" + now.Minutes.ToString() + ":" + now.Seconds.ToString();
string tots = total.Hours.ToString() + ":" + total.Minutes.ToString() + ":" + total.Seconds.ToString();
item.currentPosition.Text = nows + "/" + tots;

关键是:

total = TimeSpan.FromSeconds(aud.Player.Duration)-aud.StartTime;

aud.Player 是 Microsoft.DirectX.AudioVideoPlayback.Audio 的一个实例。

对于事实上 5:49 秒长的歌曲,它报告 39:13 作为持续时间。与 Windows Explorer 和 VLC Player 的长度相同。另外,安装 K-Lite Mega Codec 包。所以它可能会干扰。我知道这个问题:How to retrieve duration of MP3 in .NET? 但是,在我的程序的这个阶段,我没有时间从当前播放音频文件的方法切换到新的播放方法,那么我还有其他选择来确定仅使用 DirectX 的持续时间吗?还是我必须求助于 BASS.NET 或 TagLib Sharp? (元数据甚至包含 VBR 编码的 mp3 的准确信息吗?)

【问题讨论】:

标签: c# .net directx mp3


【解决方案1】:

我想把它作为评论发布给@anantoline,但是太长了……他是对的!

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

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

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

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

【讨论】:

  • 谢谢丹尼尔和@anantholine。 CPU 很宝贵,因为用户可能会在尝试加载此音频文件的同时播放多个高清视频,因此我将尝试您的 mpg123 项目,看看是否可以让它在我的上下文中工作,谢谢大家的帮助!
【解决方案2】:

AFAIK 如果不遍历整个文件一次,就不可能确定 VBR 编码的 MP3 文件的正确长度(即使没有出现,也必须进行某种解码/播放)。

您可以尝试读取 ID3 标签以获取长度(由最初编码曲目/解码曲目的应用程序在此处写入。但是,提供的 MP3 文件可能没有 ID3 标签或更糟 - ID3 标记中的值错误。

【讨论】:

  • 你的来源是什么?至少可以非常准确地估计长度
  • @Артём Царионов 甚至一次都不读取/解码整个文件?我想查看文章或来源的链接。
  • 文章本身说:“用于检测常规 mp3 文件(不是 VBR 文件)的比特率和持续时间的 php5 类(在 php4 中不起作用)”
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2015-07-25
  • 2023-01-30
相关资源
最近更新 更多