Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#/.NET/DirectX中检索mp3音频文件的正确持续时间?_C#_.net_Directx_Mp3 - Fatal编程技术网

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

如何在C#/.NET/DirectX中检索mp3音频文件的正确持续时间?,c#,.net,directx,mp3,C#,.net,Directx,Mp3,我正在编写一个媒体演示程序,我几乎完成了,但由于某些原因,我得到了不正确的mp3文件持续时间。我使用Microsoft.DirectX.AudioVideoPlayback.Audio类来播放音频文件,它对wav文件非常有效。从谷歌搜索中,我可以看出,当MP3使用可变比特率编码时,这似乎是一个问题,但是我需要我的程序准确地报告,而不管媒体的比特率设置如何。代码如下: Media_Audio aud = (Media_Audio)item.MediaFile; TimeSpan total = a

我正在编写一个媒体演示程序,我几乎完成了,但由于某些原因,我得到了不正确的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资源管理器和VLC播放器的长度相同。另外,安装K-Lite Mega编解码器包。所以它可能会干扰。我知道这个问题:
但是,在我的程序的这个阶段,我没有时间从当前播放音频文件的方法切换到新的方法,所以我是否有任何其他选项来确定仅使用DirectX的持续时间?还是我必须求助于BASS.NET或TagLib Sharp?(元数据是否包含VBR编码MP3的准确信息?

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


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

我想将其作为注释发布到@anantoline,但它太长了……他是对的

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

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

您可以使用我的mpg123端口执行以下操作:


更多:许多mp3文件都有“东西”另外,作为id3标记,如果你不浏览所有文件,你可能会在计算持续时间时错误地使用该标记。

还有一个问题:类似重复的问题;我试图在这里回答:你的来源是什么?在不读取/解码t的情况下,长度至少可以非常准确地估计@Аааааааааа请给我看一篇文章或源代码的链接。文章本身说:“php5类(在php4中不起作用)用于检测常规mp3文件(不是VBR文件)的比特率和持续时间。”感谢Daniel和@anantholine。CPU非常宝贵,因为用户可能会在加载此音频文件的同时播放多个高清视频,所以我将试用您的mpg123项目,看看是否可以在我的环境中使用,谢谢yall的帮助!