Xing designed the original VBR header, and they have an SDK on their
web site (http://www.xingtech.com/developer/mp3)
LAME produces an expanded VBR header that is backwards-compatible with
Xing's design; you should be able to find documentation on the LAME
web site (http://www.mp3dev.org). If not, ask on the mp3encoder or
lame-dev mailing lists.
Fraunhofer designed an incompatible "VBRI" header format when they
started supporting VBR encoding, but AFAIK they still haven't bothered
to document it. I partially decoded it a while ago, though - the below
should be enough for your purposes - all you need is the frame count
and file size.
Fraunhofer VBRI header format
0x0000 \
0x0001 |_______ MPEG header (160kbit/s, stereo)
0x0002 |
0x0003 /
0x0004 0x00 empty
...... .... ... .....
0x0023 0x00 empty
0x0024 0x56 'V'
0x0025 0x42 'B'
0x0026 0x52 'R'
0x0027 0x49 'I'
0x0028 0x00 ? version
0x0029 0x01 ? version
0x002a 0x09 \___encoder delay (value here correct for FhG VBR)
0x002b 0x31 /
0x002c 0x00 ? quality (high byte)
0x002d quality (1-100)
0x002e \
0x002f |_______ file length in bytes
0x0030 |
0x0031 /
0x0032 \
0x0033 |_______ file length in frames
0x0034 |
0x0035 /
0x0036 \_______ number of seek offsets
0x0037 /
0x0038 0x00 ?
0x0039 0x01 ?
0x003a 0x00 ?
0x003b 0x02 ?
0x003c \_______ offset "stride" (number of frames between offsets)
0x003d /
0x003e \_______ seek offset 0 (from beginning of this header)
0x003f /
0x0040 \_______ seek offset 1 (from previous offset)
0x0041 /
...... .... ... .....
0x0208 \_______ seek offset n (from previous offset)
0x0209 /
-- Mat.