public class ID3v24TagFooter
extends java.lang.Object
This class provides methods for reading and writing the ID3V2.4 tag footer.
The ID3v2.4 tag footer is 10 bytes long and is the last information in the ID3v2.4 tag
.
It is an optional part of the ID3v2.4 tag, and if present, is found just before the audio portion of the .mp3 file.
If an ID3v2.4 tag footer is present, then no padding can appear in the ID3v2.4 tag. That is, either padding may be present or the footer may be present,
but not both.
The structure of an .mp3 file containing an ID3v2.4 tag is shown below.
An Id3v2.4 tag footer has the following fields:
Field | Description | |
---|---|---|
1. | version | indicates which version of the ID3v2.x tag specification is stored in the .mp3 file. This value is always
ID3V2_4_FOOTER |
2. | tagSize | holds the total size of the ID3 tag, not including the header or the footer. Simply put, since the tag header and footer are each 10 bytes long, the tagSize = total tag size - 20. |
3. | unsynchronization | flag used for correcting false synchronization bytes that occur in the ID3v2.4 tag footer.
To understand why unsyncronization is used, it's helpful to understand a little about the format of .mp3 files as well as how an .mp3
file is played by a media player. MP3 audio data is stored in an .mp3 file as a series of frames (not to be confused with the frames
that are found in the ID3v2.4 tag in the .mp3 file). Each .mp3 audio frame contains a small bit of digital music encoded in the MP3
format as well as some meta data about the frame itself. At the beginning of each MP3 audio frame are 11 bits (sometimes 12) all set
to 1. This is called the synch signal, and it's the pattern a media player looks for when attempting to play an .mp3 file or stream.
If the player finds this 11/12 bit sequence, then it knows it has found an MP3 audio frame which can be decoded and played back.
Thus, if an MP3 player finds a synch signal (11/12 bit sequence of all 1's) within the ID3v2.4 tag, it will think it has found the synch signal and try to play the ID3v2.4 tag back as music, which it isn't. Thus, the ID3v2.4 tag may need to be unsynchonized so that MP3 players properly skip over the tag and only try to play proper MP3 audio frames. See sec 6.1 - unsynchronisation scheme of the ID3v2.4 spec |
4. | extendedHeaderPresent | flag indicating whether an extended header is present. If so, then the extended header will contain
more version specific data. |
5. | experimentalIndicator | flag indicating that the ID3v2.4 tag is in an experimental stage. |
6. | footerPresent | flag indicating whether a footer is present. This field is always true. |
Modifier and Type | Field and Description |
---|---|
static int |
TAG_FOOTER_SIZE
size (in bytes) of the standard ID3v2.4 tag footer
|
Constructor and Description |
---|
ID3v24TagFooter()
The default constructor is called when creating a new ID3v2.4 tag footer.
|
ID3v24TagFooter(ID3v24TagHeader header)
The constructor is called when creating a new ID3v2.4 tag footer which should be identical to an ID3v2.4 tag header except for the id bytes.
|
ID3v24TagFooter(java.io.InputStream inputStream)
This constructor is called when reading in an existing ID3v2.4 tag footer from an .mp3 file.
|
Modifier and Type | Method and Description |
---|---|
int |
getSize()
gets the total number of bytes in the ID3v2.4 tag footer.
|
int |
getTagSize()
gets the size of the ID3v2.4 tag excluding the tag header and the footer.
|
ID3TagVersion |
getVersion()
gets the version of the tag, which is always
ID3V2_4_FOOTER . |
boolean |
isDirty()
indicates whether or not the tag footer's fields have been modified.
|
boolean |
isExperimentalIndicator()
Indicates whether the ID3v2.4 tag is in an experimental stage.
|
boolean |
isExtendedHeaderPresent()
indicates whether the optional
extended header is present. |
boolean |
isFooterPresent()
Indicates whether the ID3v2.4 tag has a footer which follows the frames.
|
boolean |
isUnsynchronization()
gets whether unsynchronization was used to correct false synchronization bytes in the ID3v2.4 tag.
|
void |
save(java.io.OutputStream outputStream)
save the ID3v2.4 tag footer to the .mp3 file.
|
void |
save(java.io.RandomAccessFile file)
save the ID3v2.4 tag footer to the .mp3 file.
|
void |
setBuffer()
if the ID3v2.4 tag footer's values have been modified, then resize the raw binary buffer and store the new values there.
|
void |
setExperimentalIndicator(boolean experimentalIndicator)
sets whether the ID3v2.4 tag is in an experimental stage.
|
void |
setExtendedHeaderPresent(boolean extendedHeaderPresent)
sets whether the optional
extended header is present. |
void |
setTagSize(int tagSize)
sets the size of the ID3v2.4 tag excluding this tag header and footer.
|
void |
setUnsynchronization(boolean unsynchronization)
sets whether unsynchronization is used.
|
java.lang.String |
toString()
gets a string representation of the ID3v2.4 tag footer showing the values of the ID3v2.4 tag footer's fields.
|
public static final int TAG_FOOTER_SIZE
public ID3v24TagFooter()
public ID3v24TagFooter(ID3v24TagHeader header)
header
- the ID3v2.4 tag header whose values will be used to initialize the footer.public ID3v24TagFooter(java.io.InputStream inputStream) throws java.io.IOException, ParseException
inputStream
- input stream pointing to the beginning of the standard ID3v2.4 tag footer in the .mp3 file.java.io.IOException
- if the tag footer can not be loaded from the .mp3 file.ParseException
- if the footer is read in, but the footer's id bytes are not correct.public boolean isDirty()
setBuffer()
public ID3TagVersion getVersion()
ID3V2_4_FOOTER
.ID3V2_4_FOOTER
.public int getTagSize()
setTagSize(int)
public void setTagSize(int tagSize)
tagSize
- the size of the ID3v2.4 tag excluding the tag header and the footer.getTagSize()
public int getSize()
public boolean isUnsynchronization()
setUnsynchronization(boolean)
,
section 6.1 - unsynchronization scheme in the ID3v2.4 specificationpublic void setUnsynchronization(boolean unsynchronization)
unsynchronization
- boolean indicating whether unsynchronization is used.isUnsynchronization()
,
section 6.1 - unsynchronization scheme in the ID3v2.4 specificationpublic boolean isExperimentalIndicator()
setExperimentalIndicator(boolean)
public void setExperimentalIndicator(boolean experimentalIndicator)
experimentalIndicator
- boolean indicating whether the ID3v2.4 tag is in an experimental stage.isExperimentalIndicator()
public boolean isExtendedHeaderPresent()
extended header
is present. If it is, then you may acess it via the ID3v24Tag.getExtendedHeader()
method.extended header
is present.setExtendedHeaderPresent(boolean)
public void setExtendedHeaderPresent(boolean extendedHeaderPresent)
extended header
is present.extendedHeaderPresent
- boolean indicating whether the optional extended header
is present.isExtendedHeaderPresent()
public boolean isFooterPresent()
public void setBuffer()
public void save(java.io.OutputStream outputStream) throws java.io.IOException
outputStream
- output stream pointing to the starting location of the ID3v2.4 tag footer within the .mp3 file.java.io.IOException
- if there was an error writing the ID3v2.4 tag footer to the .mp3 file.public void save(java.io.RandomAccessFile file) throws java.io.IOException
file
- random access file pointing to the starting location of the ID3v2.4 tag footer within the .mp3 file.java.io.IOException
- if there was an error writing the ID3v2.4 tag footer to the .mp3 file.public java.lang.String toString()
toString
in class java.lang.Object