[MP3学习]MP3标签信息之ID3v1,IDv2
近来本着踏实努力一点一滴的原则,研究了下MP3,准备做一个了类于AIRPLAY的播放器,这是学习的第一篇,读取信息,做一个笔记。 参考资料:http://www.id3.org/ID3v1 http://en.wikipedia.org/wiki/ID3 ====================================================
近来本着踏实努力一点一滴的原则,研究了下MP3,准备做一个了类似于AIRPLAY的播放器,这是学习的第一篇,读取信息,做一个笔记。
参考资料:http://www.id3.org/ID3v1 http://en.wikipedia.org/wiki/ID3
========================================================================
MP3歌曲信息(ID3v1)结构如下:
所以需要一个结构体存储MP3的歌曲信息,一般声明如下:
struct MP3INFO //MP3的信息结构,固定的,存放在歌曲最后128个字节中 { char identify[3]; // TAG char Title[30]; // 歌曲名,30个字节 char Artist[30]; // 歌手名,30个字节 char Album[30]; // 所属唱片,30个字节 char Year[4]; // 年份,4个字符 char Comment[30]; // 注释,28个字节,有些说是30个,但都没啥关系,只是保留位的大小要改改 char reserved[1]; //保留,暂无用 };
知道了这些就很容易了,不敢用什么办法,只要读取到最后的128个字节,所有的相关信息就可以得到了,用VC6.0控制台程序测试如下(主代码):
#include "stdafx.h" struct MP3INFO //MP3的信息结构,固定的,存放在歌曲最后128个字节中 { char identify[3]; // TAG char Title[30]; // 歌曲名,30个字节 char Artist[30]; // 歌手名,30个字节 char Album[30]; // 所属唱片,30个字节 char Year[4]; // 年份,4个字符 char Comment[30]; // 注释,28个字节,有些说是30个,但都没啥关系,只是保留位的大小要改改 char reserved[1]; //保留,暂无用 }; int main(int argc, char* argv[]) { printf("读取一个MP3的信息,每个MP3的最后128个字节存储的,它有固定的结构,下面试读取之!\n"); MP3INFO mp3; FILE *pf = fopen("H:/1.mp3","r"); printf("打开文件:%d\n",pf); fseek(pf,-128,SEEK_END); fread(&mp3,sizeof(mp3),1,pf); printf("TAG标志:%s\n",mp3.identify); printf("曲名:%s\n",mp3.Title); printf("歌手:%s\n",mp3.Artist); printf("唱片:%s\n",mp3.Album); printf("年份:%s\n",mp3.Year); printf("注释:%s\n",mp3.Comment); fclose(pf); return 0; }
效果如下:
读取的任务完成了。对于修改,知道了这些再做完善也很容易:(如下)
memset(&mp3,0,sizeof(mp3)); printf("修改信息:\n"); mp3.Identify[0]='T'; mp3.Identify[1]='A'; mp3.Identify[2]='G'; mp3.Flag='0'; mp3.Track='5'; mp3.Style='3'; lstrcpy(mp3.Title,(LPCTSTR)"修改的名字"); lstrcpy(mp3.Artist,(LPCTSTR)"修改的作者"); lstrcpy(mp3.Album,(LPCTSTR)"修改的唱片"); lstrcpy(mp3.Year,(LPCTSTR)"1989"); lstrcpy(mp3.Comment,(LPCTSTR)"修改的注释"); fseek(pf,-128,SEEK_END); fwrite(&mp3,sizeof(mp3),1,pf);
修改完成后,在UltraEdit中查看(16进制),信息格式完全正确。但是,用Windows自带的属性查看发现,其上面的内容不全是我们修改的,这是为什么呢?
经多方查找 http://en.wikipedia.org/wiki/ID3,http://baike.baidu.com/view/66078.html
/* * ID3v1是固定的128个字节,这个你不用担心。其实ID3v1是这样安排的:如果MP3的注释是大于28个字节的,那么就要借用126-127两个字节。 * 所以ID3v1的注释部分可能是28个字节也可能是30个字节。那么,怎么区分到底是28个字节还是30个字节呢?很简单,126处就是管这个的, * 我们只要看看126处是不是0x00,如果是0x00那么注释就有28个字节。如果不等于0x00,那么就是说注释是30个字节。同时别忘了, * 由于第127字节存储了Track信息,那么如果注释是30个字节的时候,这首歌的ID3v1里的那个127处的信息自然就不是Track信息了。 * Track自然就是没有地方存了,所以127处变的没有Track意义了,它只是Comment的一部分了。 */ struct ID3v1 //MP3的信息结构,固定的,存放在歌曲最后128个字节中 { char Identify[3]; // ID3v1为TAG char Title[30]; // 歌曲名,30个字节 char Artist[30]; // 歌手名,30个字节 char Album[30]; // 所属唱片,30个字节 char Year[4]; // 年份,4个字符 char Comment[28]; // 注释,28个字节,有时是30个, char Flag; // 标志,为0说明有音轨(下一位),不一定有 char Track; // 音轨,#,歌曲号,不一定有 char Style; // 风格流派,需要查询,不一定有 };
所以对读写取程序做些修改:
void ReadID3v1(char* pfile) { printf("读取一个MP3的信息,每个MP3的最后128个字节存储的,它有固定的结构,下面试读取之!\n"); ID3v1 mp3; FILE *pf = fopen(pfile,"r+"); printf("打开文件:%d\n",pf); fseek(pf,-128,SEEK_END); fread(&mp3,sizeof(mp3),1,pf); if (mp3.Identify[0]!='T' || mp3.Identify[1]!='A' || mp3.Identify[2]!='G' ) { printf("此歌曲不支持ID3v2标准!\n"); fclose(pf); return; } printf("TAG标志:%.3s\n",mp3.Identify); printf("曲名:%.30s\n",mp3.Title); printf("歌手:%.30s\n",mp3.Artist); printf("唱片:%.30s\n",mp3.Album); printf("年份:%.4s\n",mp3.Year); printf("注释:%.30s\n",mp3.Comment); if (mp3.Flag==0) { printf("歌曲序号:%d,流派标志:%d\n",mp3.Track,mp3.Style); } getchar(); //下面试着修改信息 memset(&mp3,0,sizeof(mp3)); printf("修改信息:\n"); mp3.Identify[0]='T'; mp3.Identify[1]='A'; mp3.Identify[2]='G'; mp3.Flag='0'; mp3.Track='5'; mp3.Style='3'; lstrcpy(mp3.Title,(LPCTSTR)"修改的名字"); lstrcpy(mp3.Artist,(LPCTSTR)"修改的作者"); lstrcpy(mp3.Album,(LPCTSTR)"修改的唱片"); lstrcpy(mp3.Year,(LPCTSTR)"1989"); lstrcpy(mp3.Comment,(LPCTSTR)"修改的注释"); fseek(pf,-128,SEEK_END); fwrite(&mp3,sizeof(mp3),1,pf); printf("over,%s\n",mp3.Title); fclose(pf); }
http://blog.csdn.net/bbdxf/article/details/7438006

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

本教學向您展示如何在Windows的Chrome或Edge中找到所有開啟的標籤頁上的特定文字或短語。有沒有辦法在Chrome中所有開啟的標籤頁上進行文字搜尋?是的,您可以使用Chrome中的免費外部Web擴充功能在所有開啟的標籤上執行文字搜索,而無需手動切換標籤。一些擴充功能如TabSearch和Ctrl-FPlus可以幫助您輕鬆實現這項功能。如何在GoogleChrome的所有選項卡中搜尋文字? Ctrl-FPlus是一個免費的擴展,它方便用戶在瀏覽器視窗的所有標籤中搜尋特定的單字、短語或文字。這個擴

qq音樂讓大家盡情享受觀影解悶,每天都可以使用這個軟體,輕鬆滿足自己的使用,優質海量的歌曲,任由大家暢聽,也可以下載保存起來,下次聽的時候,不需要網絡,而在這裡下載的歌曲不是MP3格式的,無法在其他平台使用,會員歌曲過期後也沒有辦法再聽了,所以很多小伙伴們,都想要將歌曲轉換成MP3格式的,在這裡小編為你們提供方法,幫助大家都可以使用起來! 1、開啟電腦qq音樂,點選右上角【主選單】按鈕,點選【音訊轉碼】,選擇【新增歌曲】選項,新增需要轉換的歌曲; 2、新增歌曲完畢,點選選擇轉換為【mp3

從零開始學習Pygame:完整的安裝和配置教程,需要具體程式碼範例引言:Pygame是一個使用Python程式語言開發的開源遊戲開發庫,它提供了豐富的功能和工具,使得開發者可以輕鬆創建各種類型的遊戲。本文將帶您從零開始學習Pygame,並提供完整的安裝和配置教程,以及具體的程式碼範例,讓您快速入門。第一部分:安裝Python和Pygame首先,確保您的電腦上已

在word編輯文字內容時,有時會需要輸入公式符號。有的小夥子們不知道在word根號輸入的方法,小面就讓小編跟小夥伴們一起分享下word根號輸入的方法教學。希望對小夥伴們有幫助。首先,開啟電腦上的Word軟體,然後開啟要編輯的文件,並將遊標移到需要插入根號的位置,參考下方的圖片範例。 2.選擇【插入】,再選擇符號裡的【公式】。如下方圖片紅色圈的部分內容所示:3.接著選擇下方的【插入新公式】。如下方圖片紅色圈的部分內容所示:4.選擇【根式】,再選擇適當的根號。如下方圖片紅色圈的部分內容所示:

學習C語言的魅力:解鎖程式設計師的潛力隨著科技的不斷發展,電腦程式設計已經成為了一個備受關注的領域。在眾多程式語言中,C語言一直以來都備受程式設計師的喜愛。它的簡單、高效以及廣泛應用的特點,使得學習C語言成為了許多人進入程式設計領域的第一步。本文將討論學習C語言的魅力,以及如何透過學習C語言來解鎖程式設計師的潛力。首先,學習C語言的魅力在於其簡潔性。相較於其他程式語言而言,C語

在瀏覽抖音作品時,我們常常可以看到標籤後面有時鐘圖示。那麼,這個時鐘到底是什麼呢?本文將圍繞著「抖音標籤後面的時鐘是什麼」展開討論,希望為您的抖音使用提供一些有益的參考。一、抖音標籤後面的時鐘是什麼?抖音會推出一些熱門話題挑戰,用戶參與時會在標籤後看到一個時鐘圖標,這代表作品正在參與話題挑戰,並顯示挑戰的剩餘時間。對於一些具有時效性的內容,如假日、特殊活動等,抖音會在標籤後面附上時鐘圖標,提醒使用者該內容的有效期限。 3.熱門標籤:當某個標籤變得熱門時,抖音會在標籤後面加上時鐘圖標,表示這個標籤正

抖音作為一款備受歡迎的短影片社群平台,擁有龐大的使用者群體。對於抖音創作者來說,標籤引流是一種有效提升內容曝光度和吸引關注的方法。那麼,抖音怎麼帶標籤引流呢?本文將為您詳細解答這個問題,並介紹相關技巧。一、抖音怎麼帶標籤引流?發布影片時,請確保選擇與內容相關的標籤。這些標籤應涵蓋影片的主題和關鍵字,以便讓用戶透過標籤更容易找到您的影片。利用流行標籤是增加影片曝光的有效方法。研究當前熱門標籤和趨勢,將其巧妙地融入影片描述和標籤中。這些熱門標籤通常具有更高的曝光度,能夠吸引更多觀眾的注意。 3.標籤

標題:從零開始學習Go語言中的main函數Go語言作為一種簡潔、高效的程式語言,備受開發者青睞。在Go語言中,main函數是一個入口函數,每個Go程式都必須包含main函數作為程式的入口點。本文將從零開始介紹如何學習Go語言中的main函數,並提供具體的程式碼範例。一、首先,我們需要安裝Go語言的開發環境。可前往官方網站(https://golang.org
