Welcome to zimmerman's blog!

初学->进阶->高手 有很长的路要走
美静->若英->我说 有许多的歌可听

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MP3即MPEG-1 Audio Layer 3
MP3文件是由帧构成的.

MP3 文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)
ID3V2是对ID3V1的补充.在MP3的头部..ID3V1的尾128字节.

ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。
Frame:一系列的帧,个数由文件大小和帧长决定
每个FRAME 的长度可能不固定,也可能固定,由位率bitrate 决定
每个FRAME 又分为帧头和数据实体两部分
帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立

ID3V1 包含了作者,作曲,专辑等信息,长度为128BYTE。

以上的具体信息可见附件PDF文档.

先看比较简单的ID3V1
数据结构定义如下:
typedef struct tagID3V1
{
char Header[3]; /*标签头必须是"TAG"否则认为没有标签*/
char Title[30]; /*标题*/
char Artist[30]; /*作者*/
char Album[30]; /*专集*/
char Year[4]; /*出品年代*/
char Comment[28]; /*备注*/
char reserve; /*保留*/
char track;; /*音轨*/
char Genre; /*类型*/
}ID3V1,*pID3V1;


因为这部分信息的位置在MP3文件的最后128字节.因此可定位到倒数128字节开始逐项读取赋值.
以下是我写的一个C++类:封装了一些基本方法.

 

//////////////////////////////////////////////////////////////////////////
//  author: zim  2007.7.15
//////////////////////////////////////////////////////////////////////////

#ifndef ID3V1__H
#define ID3V1__H
#include 
<fstream.h>

class  ID3v1
{
public:
    ID3v1(
char* filename);
    
char* getHeader(char* header);
    
char* getTitle(char* title);
    
char* getArtist(char* artist);
    
char* getAlbum(char* album);    
    
char* getYear(char* year);
    
char* getComment(char* comment);

    
char* SetHeader(char* header);
    
char* SetTitle(char* title);
    
char* SetArtist(char* artist);
    
char* SetAlbum(char* album);    
    
char* SetYear(char* year);
    
char* SetComment(char* comment);
    
/*
    getReserve();
    getTrack();
    getGenre();
    
*/

    
virtual ~ID3v1();
private:

//    int ZeroFill(char* desc, int num);
private:
    
char Header[3];    //TAG
    char Title[30]; //标题
    char Artist[30];  //作者
    char Album[30];  //专集
    char Year[4];    //年代
    char Comment[28];    //备注
    char  Reserve;    //保留
    char  Track;    //音轨
    char  Genre;    //类型

    fstream inFile;
}
;

#endif

 再配以MFC实现操作界面.
另人奇怪的是能读取出比较小的MP3的文件信息,但是遇到稍大一点的MP3文件,读取出是乱码.

 暂时怀疑是fstream对稍大的文件支持不好?具体原因还不知道.郁闷,时间太快了,有谁知道的吭一声,谢谢!

本次研究要形成的结果:
1. 能实现查看MP3文件的内置一般信息.
2.能支持批量对MP3文件的信息进行修改.特别适合修改某歌手某专辑的.
3.能支持由MP3内置信息来以一种自定义的格式修改MP3文件名.
4.能修复一些因头文件受损而不能正常播放的MP3文件.

有兴趣的一起研究,有经验的请多指教.本人很菜.


 

附:/Files/zimmerman/mp3Info.rar

posted on 2007-07-16 02:18  zim.NET  阅读(1081)  评论(3)    收藏  举报