簡體   English   中英

正確讀取ID3標簽打斷的MP3文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM