首页 数据库 mysql教程 [MP3学习]MP3标签信息之ID3v1,IDv2

[MP3学习]MP3标签信息之ID3v1,IDv2

Jun 07, 2016 pm 03:00 PM
mp3 信息 学习 标签

近来本着踏实努力一点一滴的原则,研究了下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学习]MP3标签信息之ID3v1,IDv2

所以需要一个结构体存储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;
}
登录后复制

效果如下:

[MP3学习]MP3标签信息之ID3v1,IDv2


读取的任务完成了。对于修改,知道了这些再做完善也很容易:(如下)

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











本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在Chrome和Edge的所有选项卡中搜索文本 如何在Chrome和Edge的所有选项卡中搜索文本 Feb 19, 2024 am 11:30 AM

本教程向您展示了如何在Windows的Chrome或Edge中找到所有打开的标签页上的特定文本或短语。有没有办法在Chrome中所有打开的标签页上进行文本搜索?是的,您可以使用Chrome中的免费外部Web扩展在所有打开的标签上执行文本搜索,无需手动切换标签。一些扩展如TabSearch和Ctrl-FPlus可以帮助您轻松实现这一功能。如何在GoogleChrome的所有选项卡中搜索文本?Ctrl-FPlus是一个免费的扩展,它方便用户在浏览器窗口的所有选项卡中搜索特定的单词、短语或文本。这个扩

qq音乐怎么转换mp3格式 手机上qq音乐转mp3格式 qq音乐怎么转换mp3格式 手机上qq音乐转mp3格式 Mar 21, 2024 pm 01:21 PM

  qq音乐让大家尽情享受观影解闷,每天都可以使用这个软件,轻松满足自己的使用,优质海量的歌曲,任由大家畅听,也可以下载保存起来,下次听的时候,不需要网络,而在这里下载的歌曲不是MP3格式的,无法在其他平台使用,会员歌曲过期后也没有办法再听了,所以很多小伙伴们,都想要将歌曲转换成MP3格式的,在这里小编为你们提供方法,帮助大家都可以使用起来!  1、打开电脑qq音乐,点击右上角【主菜单】按钮,点击【音频转码】,选择【添加歌曲】选项,添加需要转换的歌曲;  2、添加歌曲完毕,点击选择转换为【mp3

揭秘C语言的吸引力: 发掘程序员的潜质 揭秘C语言的吸引力: 发掘程序员的潜质 Feb 24, 2024 pm 11:21 PM

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

Pygame入门指南:全面安装和配置教程 Pygame入门指南:全面安装和配置教程 Feb 19, 2024 pm 10:10 PM

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

一起学习word根号输入办法 一起学习word根号输入办法 Mar 19, 2024 pm 08:52 PM

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

抖音怎么带标签引流?平台什么标签最容易引流? 抖音怎么带标签引流?平台什么标签最容易引流? Mar 22, 2024 am 10:28 AM

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

抖音标签后面的时钟是什么?怎么给抖音账号打标签呢? 抖音标签后面的时钟是什么?怎么给抖音账号打标签呢? Mar 24, 2024 pm 03:46 PM

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

深入了解HTML中的video元素 深入了解HTML中的video元素 Feb 24, 2024 pm 08:18 PM

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

See all articles