gpt4 book ai didi

c# - 如何在 C#/.NET/DirectX 中检索 mp3 音频文件的正确持续时间?

转载 作者:行者123 更新时间:2023-11-30 15:38:43 36 4
gpt4 key购买 nike

我正在编写一个媒体演示程序,我快要完成了,但由于某种原因,我得到的 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 的准确信息吗?)

最佳答案

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

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

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

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

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

关于c# - 如何在 C#/.NET/DirectX 中检索 mp3 音频文件的正确持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127092/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com