2017-01-17 49 views
0

我測試了流式傳輸mp3時使用Mp3WaveFormat.AverageBytesPerSecond計算的持續時間。NAudio在計算AverageBytesPerSecond時錯誤的mp3持續時間

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

但這是不正確的,因爲mp3的實際持續時間是191秒。我不明白爲什麼會發生這種情況。我的計算有問題嗎?

的Mp3信息

enter image description here

代碼來獲取WAVEFORMAT源的mp3

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; 
} 

回答

0

MP3文件並不總是CBR(恆定比特率)。所以一些幀可能會有不同的比特率。另外一個MP3文件可以包含非音頻部分,例如它可能包含專輯封面和有關該文件的各種其他元數據。所以時間的計算只是一個估計。

+0

那麼我如何計算一個特定的第二個字節偏移來快進或快退? –

+0

並不那麼簡單。你可以計算出每個「幀」的長度,並嘗試跳到下一幀。 –