FrameBodyASPIpublic class FrameBodyASPI extends AbstractID3v2FrameBody implements ID3v24FrameBodyAudio files with variable bit rates are intrinsically difficult to
deal with in the case of seeking within the file. The ASPI frame
makes seeking easier by providing a list a seek points within the
audio file. The seek points are a fractional offset within the audio
data, providing a starting point from which to find an appropriate
point to start decoding. The presence of an ASPI frame requires the
existence of a TLEN frame, indicating the duration of the file in
milliseconds. There may only be one 'audio seek point index' frame in
a tag.
Indexed data start (S) $xx xx xx xx
Indexed data length (L) $xx xx xx xx
Number of index points (N) $xx xx
Bits per index point (b) $xx
Then for every index point the following data is included;
Fraction at index (Fi) $xx (xx)
'Indexed data start' is a byte offset from the beginning of the file.
'Indexed data length' is the byte length of the audio data being
indexed. 'Number of index points' is the number of index points, as
the name implies. The recommended number is 100. 'Bits per index
point' is 8 or 16, depending on the chosen precision. 8 bits works
well for short files (less than 5 minutes of audio), while 16 bits is
advantageous for long files. 'Fraction at index' is the numerator of
the fraction representing a relative position in the data. The
denominator is 2 to the power of b.
Here are the algorithms to be used in the calculation. The known data
must be the offset of the start of the indexed data (S), the offset
of the end of the indexed data (E), the number of index points (N),
the offset at index i (Oi). We calculate the fraction at index i
(Fi).
Oi is the offset of the frame whose start is soonest after the point
for which the time offset is (i/N * duration).
The frame data should be calculated as follows:
Fi = Oi/L * 2^b (rounded down to the nearest integer)
Offset calculation should be calculated as follows from data in the
frame:
Oi = (Fi/2^b)*L (rounded up to the nearest integer) |
Fields Summary |
---|
private static final int | DATA_START_FIELD_SIZE | private static final int | DATA_LENGTH_FIELD_SIZE | private static final int | NO_OF_INDEX_POINTS_FIELD_SIZE | private static final int | BITS_PER_INDEX_POINTS_FIELD_SIZE | private static final int | FRACTION_AT_INDEX_MINIMUM_FIELD_SIZE | private static final String | INDEXED_DATA_START | private static final String | INDEXED_DATA_LENGTH | private static final String | NUMBER_OF_INDEX_POINTS | private static final String | BITS_PER_INDEX_POINT | private static final String | FRACTION_AT_INDEX |
Constructors Summary |
---|
public FrameBodyASPI()Creates a new FrameBodyASPI datatype.
| public FrameBodyASPI(FrameBodyASPI copyObject)Creates a new FrameBodyASPI from another FrameBodyASPI
super(copyObject);
| public FrameBodyASPI(ByteBuffer byteBuffer, int frameSize)Creates a new FrameBodyASPI datatype.
super(byteBuffer, frameSize);
|
Methods Summary |
---|
public java.lang.String | getIdentifier()The ID3v2 frame identifier
return ID3v24Frames.FRAME_ID_AUDIO_SEEK_POINT_INDEX;
| protected void | setupObjectList()
objectList.add(new NumberFixedLength(INDEXED_DATA_START, this, DATA_START_FIELD_SIZE));
objectList.add(new NumberFixedLength(INDEXED_DATA_LENGTH, this, DATA_LENGTH_FIELD_SIZE));
objectList.add(new NumberFixedLength(NUMBER_OF_INDEX_POINTS, this, NO_OF_INDEX_POINTS_FIELD_SIZE));
objectList.add(new NumberFixedLength(BITS_PER_INDEX_POINT, this, BITS_PER_INDEX_POINTS_FIELD_SIZE));
objectList.add(new NumberVariableLength(FRACTION_AT_INDEX, this, FRACTION_AT_INDEX_MINIMUM_FIELD_SIZE));
|
|