2011-03-07 42 views
7

我開始用C++讀取mp3文件。爲什麼會有Synchsafe整數?

一切都很順利,直到我讀了ID3標籤的規格。 ID3v2-Header中有一些關於它的大小存儲在所謂的Synchsafe Integer中的信息。這是一個四字節整數,其中每個字節的最高有效位設置爲零。

我發現瞭如何將其轉換爲ordenaty整數,但我不能停止問自己,爲什麼一個整數值存儲在這樣的unnecessery複雜的方式。

我希望有有人爲誰可以告訴我它爲什麼以這種方式存儲。

回答

20

要理解使用同步安全整數的原因,有必要了解一些關於MP3數據格式以及媒體播放器播放MP3文件的方法。 MP3數據作爲一系列幀存儲在文件中。每個幀包含一小部分以MP3格式編碼的數字音樂以及一些關於幀本身的元數據。每個MP3幀的開頭是11位(有時是12),全部設置爲1.這稱爲同步,它是媒體播放器嘗試播放MP3文件或流時尋找的模式。如果玩家找到這個11比特序列,那麼它知道它找到了一個可以解碼和回放的MP3幀。

參見:www.id3.org/mp3Frame

正如你所知道的ID3標籤包含有關軌道作爲一個整體的數據。 ID3標籤 - 在版本2.x及更高版本中 - 位於文件的開頭,甚至可以嵌入到MP3流中(儘管通常不會這樣做)。 ID3標籤的標題包含一個32位大小的字段,表示標籤中有多少字節。無符號的32位整數可容納的最大值爲0xFFFFFFFF。所以,如果我們在大小字段中寫入0xFFFFFFFF,我們聲稱一個非常大的標籤(實際上太大)。播放器嘗試播放文件或數據流時,會查找MP3數據幀的11位序列,但會在ID3標籤標頭中查找尺寸字段並嘗試播放標籤,因爲尺寸字段具有前11個位設置。這通常聽起來不太好,這取決於你的音樂品味。解決方案是創建一個不包含全1的11位序列的整數格式。因此是同步安全的整數格式。

int ID3_sync_safe_to_int(uint8_t* sync_safe) 
{ 
    uint32_t byte0 = sync_safe[0]; 
    uint32_t byte1 = sync_safe[1]; 
    uint32_t byte2 = sync_safe[2]; 
    uint32_t byte3 = sync_safe[3]; 

    return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3; 
} 

希望這有助於:

一個同步安全整數可以使用類似下面的被轉換成在C/C的整數++。

+2

非常感謝。我以爲我永遠不會得到它。 – 2011-04-14 11:44:06

+2

真棒解釋,男人! +1! – jwueller 2011-04-14 12:58:26

+0

非常明確的解釋。謝謝你的夥伴:) – 2016-09-15 01:51:18

0

6.2。 Synchsafe整數

在標籤的某些部分,使用非同步方案很不方便,因爲非同步數據的大小事先是未知的,這對於大小描述符而言尤其成問題。 ID3v2中的解決方案是使用synchsafe整數,其中不會有任何錯誤的同步。 Synchsafe整數是保持其最高位(第7位)整數歸零,使得七位出來的八個可用。因此一個32位同步安全整數可以存儲28位信息。

http://www.id3.org/id3v2.4.0-structure

它是密切相關的,他們稱之爲「Unsynchronisation」給定的文檔中,你應該讀整章6.所有這一切都最大限度地與廣泛的軟件兼容性和相關硬件。

+0

我不undersand爲什麼大小應該是未知的。有不同大小的數據字段,但在規範中描述了特定信息存儲在文件中的信息以及此信息的大小。 – 2011-03-07 18:00:35

相關問題