3

我正在编写一个媒体演示程序,我几乎完成了,但由于某种原因,我得到的 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 包。所以它可能会干扰。我知道这个问题:如何在 .NET 中检索 MP3 的持续时间? 但是,在我的程序的这个阶段,我没有时间从当前播放音频文件的方法切换到新的播放方法,那么我还有其他选择来确定仅使用 DirectX 的持续时间吗?还是我必须求助于 BASS.NET 或 TagLib Sharp?(元数据是否甚至包含 VBR 编码的 mp3 的准确信息?)

4

2 回答 2

3

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

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

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

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

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

于 2012-06-20T22:20:20.207 回答
1

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

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

于 2012-06-20T21:59:31.153 回答