search
HomeDatabaseMysql Tutorial[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学习]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











Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
mp3和mp4区别是什么mp3和mp4区别是什么Feb 03, 2023 pm 05:21 PM

区别:1、MP4是以视频为基本载体,是一种视频格式;MP3是以音频是基本载体,是一种音频格式。2、mp3是一种用于播放mp3格式音频文件的设备,而mp4是一种用于播放mp3格式文件和mp4格式文件的设备。3、MP3只能听歌,而且存储量小,而MP4就不同了,听歌看电影,存储量大。

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

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

从零开始学Spring Cloud从零开始学Spring CloudJun 22, 2023 am 08:11 AM

作为一名Java开发者,学习和使用Spring框架已经是一项必不可少的技能。而随着云计算和微服务的盛行,学习和使用SpringCloud成为了另一个必须要掌握的技能。SpringCloud是一个基于SpringBoot的用于快速构建分布式系统的开发工具集。它为开发者提供了一系列的组件,包括服务注册与发现、配置中心、负载均衡和断路器等,使得开发者在构建微

Python 切割 mp3 片段为每 30 秒一个并降低文件码率Python 切割 mp3 片段为每 30 秒一个并降低文件码率Apr 12, 2023 am 09:28 AM

MoviePy是一个基于Python的视频编辑库,它提供了创建、编辑、合并、剪辑和转换视频的功能。以下是MoviePy的主要作用:视频剪辑:MoviePy可以剪辑视频、分离视频和音频流、添加和删除视频和音频段等。视频合并:MoviePy可以将多个视频和音频文件合并成一个。视频转码:MoviePy可以转换视频格式和编码方式,例如将mp4转换为avi或者将H.264编码转换为H.265编码等。视频编辑:MoviePy可以添加视频特效、动画和字幕等,让视频更生动和富有创意。视频生成:使用MoviePy

xm怎么转换成mp3格式xm怎么转换成mp3格式Feb 28, 2023 am 10:58 AM

xm转换成mp3格式的方法:1、打开“格式工厂”软件,点击mp3功能界面的“添加文件”按钮;2、在打开的界面中,双击文件管理器的xm文件;3、点击界面的“开始”按钮转换成mp3格式。

华为音乐怎么转换成mp3格式华为音乐怎么转换成mp3格式Feb 24, 2024 pm 12:13 PM

华为音乐中能够转换歌曲的格式,那么怎么转换成mp3格式呢?用户需要下载任意的MP3格式转换器,然后在华为音乐上将歌曲下载之后转换。这篇转换成mp3格式方法介绍就能够告诉大家具体的操作方法,不知道怎么操作的用户赶紧来看看吧。华为音乐怎么转换成mp3格式答:在任意的MP3格式转换器里转换具体方法:1、首先将想要下载的歌曲中点击设为铃声。2、将音频进度拉满,点击保存。3、之后找到音乐文件夹。4、使用任意的MP3格式转换器,将文件转换成MP3格式就可以了。

电脑下载歌曲到u盘怎么转换mp3电脑下载歌曲到u盘怎么转换mp3Nov 27, 2023 pm 03:39 PM

电脑下载歌曲到u盘通过使用音乐播放器或编辑软件进行转换和在线转换网站的方法转换mp3。详细介绍:1、打开一个支持音乐格式转换的播放器或编辑软件,导入下载的音乐文件到软件中,找到转换文件格式的选项,选择将歌曲转换为MP3格式,点击“转换”或“导出”按钮即可;2、打开在线音乐格式转换网站,上传下载的音乐文件到网站,并选择目标格式为MP3,设置转换参数点击转换即可。

mp3插电脑上只充电不识别怎么办mp3插电脑上只充电不识别怎么办Mar 17, 2023 am 10:55 AM

mp3插电脑上只充电不识别的原因及解决办法:1、USB断线所致,需要更换一条没有问题的USB线;2、电脑主板的兼容或识别有问题,可以更换USB线口或者重新换一台电脑尝试即可。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!