MP3文件信息修改


MP3文件信息

參考鏈接:https://www.jianshu.com/p/e368517ec7b9

總結:

ID3V1在MP3文件后面;
ID3V2在MP3文件前面;
現在有些文件是V1的,有些文件是V2的,
在獲取信息之前要先判斷,是V1,還是V2,
當然還有一些MP3是兩個都不存在的,就是我們看到的未知。

一、一個MP3文件大致含有如下3個部分:

TAG_V2(ID3V2) -- TAG_V2的長度不是固定的,包含了眾多關於MP3文件的信息(可選)
Frame
TAG_V1(ID3V1) -- TAG_V1的長度是固定的,128byte.期中包含MP3文件的基本信息.(可選)

二、mp3文件各可選部分的含義

1、ID3v1
ID3V1比較簡單,它是存放在MP3文件的末尾,用16進制的編輯器打開一個MP3文件,查看其末尾的128個順序存放字節,數據結構定義如下:
char Header[3]; /*1-3 3 存放"TAG"字符,表示ID3V1.0標准,標簽頭必須是"TAG", 否則認為沒有標簽*/
char Title[30]; /*歌名: 4-33 30*/
char Artist[30]; /*作者: 34-63 30*/
char Album[30]; /*專輯名: 64-93 30*/
char Year[4]; /*年代: 94-97 4*/
char Comment[30]; /*備注: 98-127 30*/
char Genre; /*類別: 128 1 MP3*/

2、ID3V2
ID3V2到現在一共有4個版本,但流行的播放軟件一般只支持第3版,既ID3v2.3。
由於ID3V1記錄在MP3文件的末尾,ID3V2就只好記錄在MP3文件的首部了(如果有一天發布ID3V3,真不知道該記錄在哪里)。
正是由於這個原因,對ID3V2的操作比ID3V1要慢。而且ID3V2結構比ID3V1的結構要復雜得多,但比前者全面且可以伸縮和擴展。

2.1、ID3V2.3
每個ID3V2.3的標簽都一個標簽頭和若干個標簽幀或一個擴展標簽頭組成。
關於曲目的信息如標題、作者等都存放在不同的標簽幀中,擴展標簽頭和標簽幀並不是必要的,但每個標簽至少要有一個標簽幀。
標簽頭和標簽幀一起順序存放在MP3文件的首部。

##############################################################################

 

mp3 音頻 音樂 tag ID3 ID3V1 ID3V2 標簽 讀取信息

https://blog.csdn.net/u013401219/article/details/48103315

1.mp3標簽簡介

我們得到一個mp3文件后,通過播放器,或是右擊看其屬性,我們會發現除了文件大小和名字,還會有一些其他信息。比如作者,類型,年月日,有的還有一個小圖片。

這些信息都是在mp3的源文件內。源文件內除了音樂的數據,還會有一些標識性信息。在計算機的世界,幾乎所有的文件都是這樣,不然系統怎么直到你這一堆二進制代碼是什么東西,我要對它做什么。

在mp3的數據內,有多種標簽標識它的信息,最常見的就是ID3。一開始是ID3V1,這個標簽在mp3的最后128個字節。前3個字節是TAG,用來標識標簽的開始。在linux下,你可以用vim直接打開一個mp3文件,移到最后看一下。在windows下可以用UItraEdit。后面不同的標簽會有不同的標識符,每個標識符后面就是相應的數據。ID3V1的各標識符的大小都是固定的,很好讀取。不過有些限制,就是不能存中文,沒有圖片,表示的內容也有限。

    圖:ID3V1標簽結構

 

后來ID3升級到ID3V2。ID3V2有4個版本,現在常見的應該是ID3V2.4,也就是第4個版本。ID3V2的標簽在mp3的開頭。前10個字節是整個標簽的標簽頭,記錄了這個標簽的標識,版本,整個標簽的大小。前3個是標識位,其值為ID3,表示標簽存在,如果前三個字節不是ID3,那就表示沒有ID3V2的標簽。然后一個字節是版本號,下一個字節為副版本號,再下一個是標志位。這三個字節都沒太大用。最后4個字節是標簽的大小,這個挺重要。

 圖:ID3V2標簽結構

 

圖:ID3V2頭結構

說一下這四個字節是如何計算標簽大小的。你最好用BYTE類型或是unsigned char類型類保存這四個字節,如果高位為1,會被認為負數。不過這里不用怕這個,因為這四個字節的每一個字節的最高位都是0,況且計算時去掉這四位。什么意思呢?就是本來是用4個字節,也就是32位的二進制數來表示標簽大小,在這里把最高位都制為0,並且去掉,不加入計算。也就相當於是28位2進制數來表示標簽大小。具體原因不明,反正成為了規定,就遵循吧。計算公式:

int Len = (size[0]&0x7f)*0x200000
  +(size[1]&0x7f)*0x4000
  +(size[2]&0x7f)*0x80
  +(size[3]&0x7f);

得到的數就是標簽的大小,也就是多少個字節。但是這個大小是不包括標簽頭的10個字節的。

 

讀完這10個標簽頭的字節,再往下讀10個字節就是標簽幀的幀頭了,和標簽頭的10個字節一樣,它也記錄了標簽幀的大小,標簽的內容和標志。

char FrameID[4]; /*用四個字符標識一個幀,說明其內容*/

BYTE Size[4]; /*幀內容的大小,不包括幀頭,不得小於1*/
char Flags[2]; /*存放標志,只定義了6位*/
 
 圖:ID3V2幀頭結構
這就是幀頭的格式,比如你如果讀的FrameID是TIT2的話,那就表示這個幀的數據部分保存的是歌曲名,這都是有一一對應的表的。
幀的大小的計算和標簽頭不一樣,沒有要去掉的位,32個2進制全用來表示這個幀除了幀頭10個字節外的剩下的數據部分的大小。計算公式:
int Len= size[0]*0x1000000
   +size[1]*0x10000
   +size[2]*0x100
   +size[3];
在這里size的類型必須是無符號的單字節類型。就是上面我說的BYTE或是unsigned char。不然你可能計算的值很大或是負數。
標識位可以不用考慮,FrameID對應表,可以查一下,這里只說兩個,TIT2表示是歌的名字,APIC表示是圖片。
 
2.讀取mp3內部中文信息
比如上面如果幀的ID是TIT2,那就表示這個幀里面保存的是歌曲的名字。我們通過size來計算出幀的大小(當然是不包括幀頭的10個字節),那么我們就從幀頭的下一個字節往后讀Len個字節,那么這里面的數據就是歌曲名字。幀與幀之間是緊密挨着的,Len+1個字節開始就是下一個幀的幀頭了。
其實我們讀取的Len個字節並不全是歌曲名字,因為如果是字符串的內容的話,幀頭下面的第一個字節,也就是Len個字節的第一個字節是用來表示這個字符串使用什么編碼方式編碼的。不同的編碼方式,讀取的方式不一樣,必須要標明,不然你輸出的內容就是一堆亂碼。這里有一個對應表:
0代表字符使用ISO-8859-1編碼方式;

1代表字符使用UTF-16編碼方式;

2代表字符使用 UTF-16BE編碼方式;

3代表字符使用UTF-8編碼方式。

目前只有4中編碼方式,你可以計算第一個字節的大小,然后和這個表對應,就能直到使用什么編碼方式保存的數據了。

如果是0或是3這兩種編碼方式的話,你就用一個char的數組去讀這個數據,然后輸出,就是你想要的內容。

如果是1或2這兩種編碼的話,那就要用寬字節數組去讀,就是wchar_t聲明的數組讀取。

記住要跳過第一個字節。

 

3.讀取圖片

如果你想讀取mp3里面的專輯圖片的話,就要找到APIC標簽,然后計算出標簽大小。APIC標簽的數據部分也比較特殊,首先在數據的前幾個字節里面,並沒有圖片的數據,而是告訴你這里保存的圖片數據是什么格式的,大部分都是jpeg的,因為占地小。

在數據部分前幾個字節會出現一個特殊標志 image/jpeg 來標明下面的數據是jpeg格式的,如果是其他格式則為image/png image/bmp,jpeg的格式可能會有jpg peg等格式來表示。也就是image/jpg 也表示是jpeg的。

然后開始讀取圖片數據,在image/jpeg這個標志后面就保存了圖片的數據,不過並不是image/jpeg結束后第一個字節就是圖片數據,在這里image/jpeg出現的位置和圖片的數據開始的位置都是不固定的,就是在它們前后可能都有一些空字節,所以要判斷一下。

我們查詢jpeg的圖片格式可以知道當連着的兩個字節是16進制0xFFD8時,就表示圖片的數據開始的位置,所以你要從這里開始讀,包括0xFFd8也要讀進去,也就是FF是第一個字節,D8是第二個字節,然后往下讀,直到讀到連續兩個字節是0xFFD9,這就表示圖片數據讀完了,記住也要把這兩個結束字符讀進去。

前面我們已經計算出這個APIC的大小,你可以用這個大小減去不是圖片數據的字節數,從0xFFD8開始讀剩下的字節數就可以了。

我們把讀到的數據放到數組里,然后寫到一個空文件里,就是一幅jpeg的圖片了

 

4.圖片轉換

得到jpeg圖片后,如果我們想轉換成其它圖片,那么就需要進行圖片轉碼了。jpeg圖像之所以很小,是因為里面進行了多次壓縮。先要把計算機上常用的RGB圖像源數據轉換成YCrCb,然后進行DCT變換,重排DCT結果,量化,這樣就會是圖像數組的左上角是相似的數字,剩下的大部分是0。然后是RLE編碼,huffman編碼。最后編出來一堆你不認識的值,加上各種段,標志,保存成jpeg。所以如果我們想轉換成其它圖片的話,就要反着來一邊。這個工作比較麻煩,也比較復雜。所以我們可以用第三方的庫來實現。我這里用的是jpeglib。

網站:http://www.ijg.org/

然后下載jpegsr8d.zip包。雖然它寫着是for windows的,其實里面是一個linux下的工程,你需要的東西必須編譯一下,才能生成。

在包的里面有一個install.txt的文檔,里面告訴你在不同的環境下如何編譯,我截取一段在windows下用vs2010編譯的部分:

Microsoft Windows, Microsoft Visual C++ 2010 Developer Studio (v10):

We include makefiles that should work as project files in Visual Studio
2010 or later.  There is a library makefile that builds the IJG library
as a static Win32 library, and application makefiles that build the sample
applications as Win32 console applications.  (Even if you only want the
library, we recommend building the applications so that you can run the
self-test.)

To use:
1. Open the command prompt, change to the main directory and execute the
   command line
 NMAKE /f makefile.vc  setup-v10
   This will move jconfig.vc to jconfig.h and makefiles to project files.
   (Note that the renaming is critical!)
2. Open the solution file jpeg.sln, build the library project.
   (If you are using Visual Studio more recent than 2010 (v10), you'll
   probably get a message saying that the project files are being updated.)
3. Open the solution file apps.sln, build the application projects.
4. To perform the self-test, execute the command line
 NMAKE /f makefile.vc  test-build
5. Move the application .exe files from `app`\Release to an
   appropriate location on your path.

Note:
There seems to be an optimization bug in the compiler which causes the
self-test to fail with the color quantization option.
We have disabled optimization for the file jquant2.c in the library
project file which causes the self-test to pass properly.

也就是先執行NMAKE /f makefile.vc  setup-v10,然后用vs打開jpeg.sln工程,編譯一下,然后打開apps.sln工程,里面有好幾個工程,每一個都編譯一遍,這時候你得到這四個文件:jconfig.h jmorecfg.h jpeg.lib jpeglib.h,把它們放到你的工程目錄下,然后在程序開始包含頭文件的時候包含進去就可以了。然后上網搜一下copy 粘貼最多的那片文章,把里面代碼稍微改一下就可以用了。后面的命令是測試用的,不用管。

如何執行NMAKE /f makefile.vc  setup-v10?先打開開始菜單,找到visual studio2010的文件夾,找到visual studio tools,然后在里面打開x64 cross tools command,進入到makefile.vc目錄下,也就是你解壓的目錄下,執行就可以了。在這個command下切換目錄是,先輸入文件所在盤符名,比如C:,回車,然后cd 加文件名進入即可。

這個第三方庫幫我們把jpeg的解碼都做了,我們獲得其中的圖像數據RGB,然后上網查一下bmp的格式,然后把那篇拷貝粘貼最多的程序,改一下把數據寫進去就可以了。

bmp格式很簡單,只有兩個頭標簽,然后是把RGB數據寫到標簽后面就行了,沒有壓縮,所以比jpeg大十幾倍或幾十倍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM