Re: obtaining stream length from mad decoder
Rob Leslie <[email protected]> Thu, 28 Jul 2005 20:26:08 -0700
| Newsgroups | gmane.comp.audio.mad.devel |
|---|---|
| Message-ID | <[email protected]> |
On Jul 28, 2005, at 3:48 PM, Langley, Adam wrote: > I have written a Managed C++ wrapper for the libMad decoder, and I > would like to know…. How can I get EITHER, the _decoded_ length in > bytes, or the duration in seconds of the whole file, without > decoding the whole file? > > I need to just evaluate a set of mp3 files, and obtain their > lengths (preferably in bytes, then I can calculate the length in > seconds by the bytes-per-second) There is no official decoded length in bytes, as the number of output bits per sample is unspecified. Rather, you can determine the length in samples -- although it is often simpler to determine the length directly in units of time. There are four possible methods for determining the length of an entire file: 1. Read the length from a 'TLEN' frame of an ID3v2 tag. If present, this is supposed to contain the length of the audio file in milliseconds (as a numeric string). 2. Read a Xing tag from the ancillary data of the first decoded frame. Multiply the playing time of one frame (given by frame- >header.duration) by the number of frames in the file as given by the tag. 3. Assuming the file has a constant bitrate (not VBR), divide the file size in bytes (less any ID3 tags) by (125 * kbps) to obtain the playing time in seconds. 4. Scan every frame header of the file and accumulate the playing time of each to arrive at a total. This does not require a full decode of each frame, so it can be done relatively quickly. -- Rob Leslie [email protected]