[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脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++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

学习C语言的魅力:解锁程序员的潜力随着科技的不断发展,计算机编程已经成为了一个备受关注的领域。在众多编程语言中,C语言一直以来都备受程序员的喜爱。它的简单、高效以及广泛应用的特点,使得学习C语言成为了许多人进入编程领域的第一步。本文将讨论学习C语言的魅力,以及如何通过学习C语言来解锁程序员的潜力。首先,学习C语言的魅力在于其简洁性。相比其他编程语言而言,C语

从零开始学习Pygame:完整的安装和配置教程,需要具体代码示例引言:Pygame是一个使用Python编程语言开发的开源游戏开发库,它提供了丰富的功能和工具,使得开发者可以轻松创建各种类型的游戏。本文将带您从零开始学习Pygame,并提供完整的安装和配置教程,以及具体的代码示例,让您快速入门。第一部分:安装Python和Pygame首先,确保您的计算机上已

在word中编辑文字内容时,有时会需要输入公式符号。有的小伙们不知道在word根号输入的方法,小面就让小编跟小伙伴们一起分享下word根号输入的方法教程。希望对小伙伴们有所帮助。首先,打开电脑上的Word软件,然后打开要编辑的文件,并将光标移动到需要插入根号的位置,参考下方的图片示例。2.选择【插入】,再选择符号里的【公式】。如下方的图片红色圈中部分内容所示:3.接着选择下方的【插入新公式】。如下方的图片红色圈中部分内容所示:4.选择【根式】,再选择合适的根号。如下方的图片红色圈中部分内容所示:

抖音作为一款备受欢迎的短视频社交平台,拥有着庞大的用户群体。对于抖音创作者来说,带标签引流是一种有效提升内容曝光度和吸引关注的方法。那么,抖音怎么带标签引流呢?本文将为您详细解答这个问题,并介绍相关技巧。一、抖音怎么带标签引流?发布视频时,要确保选择与内容相关的标签。这些标签应涵盖视频的主题和关键词,以便让用户通过标签更容易找到您的视频。利用流行标签是增加视频曝光的有效方法。研究当前热门标签和趋势,将其巧妙地融入视频描述和标签中。这些热门标签通常具有更高的曝光度,能够吸引更多观众的关注。3.标签

在浏览抖音作品时,我们经常能看到标签后面有一个时钟图标。那么,这个时钟到底是什么呢?本文将围绕“抖音标签后面的时钟是什么”展开讨论,希望为您的抖音使用提供一些有益的参考。一、抖音标签后面的时钟是什么?抖音会推出一些热门话题挑战,用户参与时会在标签后看到一个时钟图标,这代表作品正在参与话题挑战,并显示挑战的剩余时间。对于一些具有时效性的内容,如节假日、特殊活动等,抖音会在标签后面附上时钟图标,提醒用户该内容的有效期限。3.热门标签:当某个标签变得热门时,抖音会在标签后面添加时钟图标,表示这个标签正

HTML中video视频标签详解HTML5中的video标签是一种用于在网页上播放视频的标签。它可以使用不同的格式来呈现视频,例如MP4、WebM、Ogg等等。在本篇文章中,我们将详细介绍video标签的使用方法,并提供具体的代码示例。基本结构下面是video标签的基本结构:
