通过AverageBytesPerSecond计算时,NAudio错误的mp3持续时间

时间:2017-01-17 01:37:36

标签: c# mp3 naudio duration

我测试了流式播放时使用Mp3WaveFormat.AverageBytesPerSecond计算的持续时间。

AverageBytesPerSecond: 64 kbps
Content Length: 2436943 bytes
Duration: 2436943 / (64 / 8 * 1024) = 297 seconds

但这不正确,因为mp3的实际持续时间是191秒。我不明白为什么会这样。我的计算有问题吗?

  

Mp3信息

enter image description here

  

获取源mp3的WaveFormat的代码

HttpWebRequest req = SendRequest(url, 0, 0);
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
size = resp.ContentLength;
Stream str = resp.GetResponseStream();
byte[] buffer = new byte[1024];
byte[] storer = new byte[1024 * 100];
int bytesRead = 0;
int total = 0;
while ((bytesRead = str.Read(buffer, 0, buffer.Length)) > 0)
{
     Buffer.BlockCopy(buffer, 0, storer, total, bytesRead);
     total += bytesRead;
     Mp3Frame frame = Mp3Frame.LoadFromStream(new MemoryStream(storer));
     if (frame == null) continue;

     format = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2,
     frame.FrameLength, frame.BitRate);
     decompressor = new AcmMp3FrameDecompressor(format);

     req.Abort();
     resp.Close();
     str.Close();

     break;
}

1 个答案:

答案 0 :(得分:0)

MP3文件并不总是CBR(恒定比特率)。因此,某些帧可能具有不同的比特率。 MP3文件也可以包含非音频部分,例如它可能包括专辑封面和关于该文件的各种其他元数据。所以持续时间的计算只是估计值。