我正在编写一个媒体演示程序,我几乎完成了,但是由于某种原因,我得到的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确切长度的唯一方法是将其整体解码,或者(如果您知道如何)逐一读取帧的所有标头,并收集其解码的DURATION.
仅当您使用的CPU是您需要保存的宝贵资源时,才使用后面的方法.否则,解码整个文件,您将拥有持续时间.
您可以使用我的mpg123端口进行工作:http://sourceforge.net/projects/mpg123net/
更多:许多mp3文件都添加了“ stuff”作为id3标签,如果您不浏览所有文件,则可能会在持续时间计算中错误地使用该标签.