[英]Proper reading of MP3 file disrupted by ID3 tags
我的中學項目定於本周四舉行,我在閱讀MP3文件時遇到了主要問題(該項目是關於聲音分析的,不要問我確切的含義以及為什么這么晚才這樣做)。
首先,我讀取前10個字節以檢查ID3標簽。 如果它們存在,我將跳到第一個MP3標頭-至少這是個好主意。 這是我計算ID3標簽大小的方法:
if (inbuf[0] == 'I' && inbuf[1] == 'D' && inbuf[2] == '3') //inbuf contains first 10 bytes from file
{
int size = inbuf[3] * 2097152 + inbuf[4] * 16384 + inbuf[5] * 128 + inbuf[6]; //Will change to binary shifts later
//Do something else with it - skip rest of ID3 tags etc
}
對於沒有ID3標簽的文件以及帶有它們的某些文件,它可以正常工作,但是對於某些其他文件,ffmpeg(我用於解碼)返回“ no header”錯誤,這意味着它沒有正確捕獲MP3標頭。 我知道,因為如果我從該.mp3文件(例如Winamp)中刪除ID3,則不會發生任何錯誤。 結論是大小計數算法並不總是有效的。
所以問題是:我怎么知道.mp3文件的整個ID3部分(所有可能的標簽,專輯圖片等等)到底有多大? 我到處都在尋找它,但我一直在尋找上面發布的算法。 有時我還需要考慮一些大約10字節的頁腳,但是看來它經常會超過10字節才能最終捕獲正確的MP3幀。
ID3v1標簽的大小始終固定為128字節。
我會發現以下描述
如果將所有這些字段的大小相加,我們將看到30 + 30 + 30 + 4 + 30 + 1等於125個字節,而不是128個字節。 缺少的三個字節可以在標簽的開頭,歌曲標題之前找到。 這三個字節始終是“ TAG”,並且標識這確實是ID3標簽。 查找ID3v1 / 1.1標簽的最簡單方法是從文件末尾查找128字節的單詞“ TAG”。
資料來源: http : //id3.org/ID3v1
還有另一個版本,稱為ID3v2:
設計目標之一是ID3v2應該非常靈活和可擴展...由於每個幀可以為16MB,整個標簽可以為256MB,您可能永遠不會再遇到嘗試編寫有用的代碼時的情況了。舊ID3中的注釋最多只能包含30個字符。
此ID3v2始終從音頻文件的開頭開始,您可以在此處閱讀: http : //id3.org/ID3v2Easy
ID3v2/file identifier "ID3"
ID3v2 version $03 00
ID3v2 flags %abc00000
ID3v2 size 4 * %0xxxxxxx
ID3v2標簽大小用四個字節編碼,其中最高有效位(第7位)在每個字節中均設置為零,總共28位。 零位將被忽略,因此257字節長的標記表示為$ 00 00 02 01。
bool LameDecoder::skipDataIfRequired()
{
auto data = m_file.read(3);
Q_ASSERT(data.size() == 3);
if (data.size() != 3)
return false;
if (memcmp(data.constData(), "ID3", 3))
{
m_file.seek(0);
return true;
}
// ID3v2 tag is detected; skip it
m_file.seek(3+2+1);
data = m_file.read(4);
if (data.size() != 4)
return false;
qint32 size = (data[0] << (7*3)) | (data[1] << (7*2)) |
(data[2] << 7) | data[3];
m_file.seek(3+2+1+4+size);
return true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.