[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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









このチュートリアルでは、Windows の Chrome または Edge で開いているすべてのタブで特定のテキストまたは語句を検索する方法を説明します。 Chrome で開いているすべてのタブでテキスト検索を行う方法はありますか?はい。Chrome で無料の外部 Web 拡張機能を使用すると、タブを手動で切り替えることなく、開いているすべてのタブでテキスト検索を実行できます。 TabSearch や Ctrl-FPlus などの一部の拡張機能を使用すると、これを簡単に実現できます。 Google Chrome のすべてのタブでテキストを検索するにはどうすればよいですか? Ctrl-FPlus は、ユーザーがブラウザ ウィンドウのすべてのタブで特定の単語、語句、またはテキストを簡単に検索できるようにする無料の拡張機能です。この展開は

QQ Music を使用すると、誰でも映画を楽しんだり、退屈を解消したりすることができます。このソフトウェアを毎日使用して、あなたのニーズを簡単に満たすことができます。誰もが聴くことができる高品質の曲が多数用意されています。ダウンロードして保存することもできます。次回聴くときはインターネット接続は必要ありません。ここでダウンロードした曲は MP3 形式ではないため、他のプラットフォームでは使用できません。メンバーシップ曲の有効期限が切れると、再度聴くことはできません。そのため、 , 多くの友人が曲を MP3 形式に変換したいと考えています。ここでは、編集者が説明します。誰もが使用できるように方法を提供しています。 1. コンピュータで QQ Music を開き、右上隅の [メインメニュー] ボタンをクリックし、[オーディオトランスコーディング] をクリックし、[曲を追加] オプションを選択して、変換する必要がある曲を追加します; 2. 追加した後、曲をクリックして [mp3] に変換を選択します

C言語学習の魅力:プログラマーの可能性を引き出す テクノロジーの発展に伴い、コンピュータプログラミングは大きな注目を集めている分野です。数あるプログラミング言語の中でもC言語は常にプログラマーに愛されています。そのシンプルさ、効率性、幅広い用途により、C 言語の学習は、多くの人にとってプログラミングの分野に入る最初のステップとなっています。この記事では、C言語を学ぶ魅力と、C言語を学ぶことでプログラマーの可能性を引き出す方法について解説します。 C言語学習の魅力は、まずその簡単さにあります。他のプログラミング言語と比較すると、C言語は

Pygame をゼロから学ぶ: 完全なインストールと構成チュートリアル、特定のコード例が必要 はじめに: Pygame は、Python プログラミング言語を使用して開発されたオープン ソースのゲーム開発ライブラリであり、豊富な機能とツールを提供し、開発者はさまざまなタイプのゲームを簡単に作成できますゲームの。この記事は、Pygame をゼロから学習するのに役立ち、完全なインストールと構成のチュートリアルと、すぐに始めるための具体的なコード例を提供します。パート1:最初にPythonとPygameをインストールして、確認してください

Word でテキスト コンテンツを編集するときに、数式記号の入力が必要になる場合があります。 Word でルート番号を入力する方法を知らない人もいるので、Xiaomian は私に、Word でルート番号を入力する方法のチュートリアルを友達と共有するように頼みました。それが私の友達に役立つことを願っています。まず、コンピュータで Word ソフトウェアを開き、編集するファイルを開き、ルート記号を挿入する必要がある場所にカーソルを移動します。下の図の例を参照してください。 2. [挿入]を選択し、記号内の[数式]を選択します。下の図の赤丸で示すように: 3. 次に、下の[新しい数式を挿入]を選択します。以下の図の赤丸で示すように: 4. [根号式]を選択し、適切な根号を選択します。下の図の赤丸で示したように、

人気のショートビデオソーシャルプラットフォームとして、Douyin は巨大なユーザーベースを持っています。 Douyin クリエイターにとって、タグを使用してトラフィックを集めるのは、コンテンツの露出を増やして注目を集める効果的な方法です。では、Douyin はトラフィックを集めるためにタグをどのように使用しているのでしょうか?この記事では、この質問に詳しく答え、関連するテクニックを紹介します。 1. Douyin にタグを追加してトラフィックを集めるにはどうすればよいですか?動画を投稿するときは、必ずコンテンツに関連したタグを選択してください。ユーザーがタグからビデオを見つけやすくするために、これらのタグはビデオのトピックとキーワードをカバーする必要があります。人気のハッシュタグを活用することは、動画の露出を増やす効果的な方法です。現在人気のタグやトレンドを調査し、動画の説明やタグに組み込んでください。これらの人気のあるタグは通常、視認性が高く、より多くの視聴者の注目を集めることができます。 3. ラベル

Douyin の作品を閲覧していると、タグの後ろに時計のアイコンが表示されることがよくあります。それで、この時計は一体何なのでしょうか?この記事では、「Douyin ラベルの背後にある時計とは何か」についての議論に焦点を当て、Douyin を使用する際に役立つ参考になれば幸いです。 1. Douyin ラベルの後ろにある時計は何ですか? Douyin はいくつかのホットなトピック チャレンジを開始します。ユーザーが参加すると、タグの後に時計アイコンが表示されます。これは、その作品がトピック チャレンジに参加していることを意味し、チャレンジの残り時間が表示されます。休日や特別なイベントなど、時間に敏感な一部のコンテンツの場合、Douyin はラベルの後に時計アイコンを添付して、コンテンツの有効期間をユーザーに思い出させます。 3. 人気のタグ: タグが人気になると、Douyin はタグの後に時計アイコンを追加して、そのタグが人気であることを示します。

タイトル: Go言語のmain関数をゼロから学ぶ Go言語はシンプルで効率的なプログラミング言語として開発者に好まれています。 Go 言語では、main 関数はエントリ関数であり、すべての Go プログラムにはプログラムのエントリ ポイントとして main 関数が含まれている必要があります。この記事ではGo言語のmain関数をゼロから学ぶ方法と具体的なコード例を紹介します。 1. まず、Go 言語開発環境をインストールする必要があります。公式ウェブサイト (https://golang.org) にアクセスできます。
