2017-01-17 9 views
0

Ich habe die Dauer, die mit Mp3WaveFormat.AverageBytesPerSecond beim Streamen von MP3 berechnet wird getestet.NAudio falsche MP3-Dauer bei der Berechnung von AverageBytesPerSecond

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

Aber das ist nicht korrekt, denn die tatsächliche Dauer des MP3 ist 191 Sekunden. Ich kann nicht verstehen, warum das passiert. Stimmt etwas in meiner Berechnung nicht?

Mp3 Informationen

enter image description here

-Code WAVE der Quelle 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; 
} 

Antwort

0

MP3-Dateien sind nicht immer CBR (konstante Bitrate) zu erhalten. Einige Frames könnten also eine andere Bitrate haben. Auch eine MP3-Datei kann Nicht-Audio-Teile enthalten, zum Beispiel Albumcover und verschiedene andere Metadaten über die Datei. Berechnungen der Dauer sind also nur eine Schätzung.

+0

Also, wie kann ich eine bestimmte Sekunde Byte-Offset berechnen, um einen schnellen Vor- oder Rücklauf? –

+0

Es ist nicht so einfach. Sie können herausfinden, wie lange jedes "Frame" ist und versuchen, zum nächsten Frame zu springen. –

Verwandte Themen