c语言程序设计MP3或MP4文件基本信息的解析

任意选择一首MP3歌曲文件,要求解析出该歌曲文件,要求解析出该歌曲文件,要求解析出该歌曲文件,要求解析出该歌曲文件,要求解析出该歌曲文件,要求解析出该MP3文件头部和尾的... 任意选择一首 MP3 歌曲文件,要求解析出该 歌曲文件,要求解析出该 歌曲文件,要求解析出该 歌曲文件,要求解析出该 歌曲文件,要求解析出该 歌曲文件,要求解析出该 MP3 文件头部和尾的所有信息(如歌手名、 文件头部和尾的所有信息(如歌手名、 歌曲名、专辑年份播放时长等), 歌曲名、专辑年份播放时长等), 并显示出这些信息 。
MP3 的文件头长 10Byte ,主要保存 ID3 ,ID3 ID3版本和副信息,以及 Flag Flag和帧长的信 息;尾部的 128 字节保存了 Header( 尾部头, 3Byte) ,Title( 歌曲名称, 30B yte) ,Arti st( 艺 术家, 30Byte) ,Album( 专辑, 30Byte) ,Year( 发行年份, 4Byte) ,Comment( 评论, 30Byte) , Genre( 类型 ,1Byte) 。3+30+4+1=128
提示:请先查阅 MP3 或 MP4 文件格式 相关的资料。 如果有两个同学做此题目,则 一个同 学解析 MP3 ,另外一个同学解析 MP4 。
求代码,求代码的解释,我们要答辩的啊,各位大神啊,救救我吧,有追加分的。
请教一下tag_ID3_INFO我编译的时候为什么出错
展开
 我来答
wbchn
2012-05-25 · TA获得超过338个赞
知道小有建树答主
回答量:164
采纳率:0%
帮助的人:205万
展开全部
找了个MP3看了下,comment是29个字节。
可参考 http://www.chineselinuxuniversity.net/articles/27374.shtml

拿VC的C语言写了下:
头文件:
#include <stdio.h>

// TODO: reference additional headers your program requires here

#define MP3_ID3_LENGTH 10
typedef struct tag_ID3_INFO
{

} ID3_INFO;

#define IDENTIFY_LEN 3
#define TITLE_LEN 30
#define ARTIST_LEN 30
#define ALBUM_LEN 30
#define YEAR_LEN 4
#define COMMENT_LEN 30
#define GENRE_LEN 1

// IDENTIFY_LEN + TITLE_LEN +...
#define MP3_INFO_LENGTH 128

typedef struct tag_MP3_INFO
{
char Identify[IDENTIFY_LEN + 1]; //TAG三个字母
//这里可以用来鉴别是不是文件信息内容
char Title[TITLE_LEN + 1]; //歌曲名,30个字节
char Artist[ARTIST_LEN + 1]; //歌手名,30个字节
char Album[ARTIST_LEN + 1]; //所属唱片,30个字节
char Year[YEAR_LEN + 1]; //年,4个字节
char Comment[COMMENT_LEN + 1]; //注释,28个字节
char Genre[GENRE_LEN + 1]; //类型 ,1个字节
} MP3_INFO;

C文件:
#include <string.h>

#define MP3_OK 1
#define MP3_ERROR 1

FILE *OpenMp3File(char *pFileName);
int ReadMP3Info(FILE *pFile, MP3_INFO *pstInfo);
int OutputMP3Info(MP3_INFO *pstMp3Info);

int main(int argc, char* argv[])
{
FILE *pFile = NULL;
MP3_INFO stMp3Info = {0};
char *pfname = "E:\\Project\\MP3\\test.MP3";

pFile = OpenMp3File(pfname);
if (NULL == pFile)
{
return MP3_ERROR;
}

ReadMP3Info(pFile, &stMp3Info);

printf("\r\nMP3 file: %s", pfname);
OutputMP3Info(&stMp3Info);

printf("Hello World!\n");
return MP3_OK;
}

FILE *OpenMp3File(char *pFileName)
{
FILE *pFile = NULL;
pFile = fopen(pFileName,"rb");
if (NULL==pFile)
{
printf("open read file error!!");
return NULL;
}

return pFile;
}

int ReadMP3Info(FILE *pFile, MP3_INFO *pstInfo)
{
int len = 0;
if ((NULL == pFile) || (NULL == pstInfo))
{
return MP3_ERROR;
}

fseek(pFile, 0, SEEK_END);
len = ftell(pFile);
if (len <= (MP3_INFO_LENGTH + MP3_ID3_LENGTH))
{
return MP3_ERROR;
}

memset(pstInfo, 0, sizeof(MP3_INFO));

fseek(pFile, -MP3_INFO_LENGTH, SEEK_END);
len = fread((char *)(pstInfo->Identify), 1, IDENTIFY_LEN, pFile);
len += fread((char *)(pstInfo->Title), 1, TITLE_LEN, pFile);
len += fread((char *)(pstInfo->Artist), 1, ARTIST_LEN, pFile);
len += fread((char *)(pstInfo->Album), 1, ALBUM_LEN, pFile);
len += fread((char *)(pstInfo->Year), 1, YEAR_LEN, pFile);
len += fread((char *)(pstInfo->Comment), 1, COMMENT_LEN, pFile);
len += fread((char *)(pstInfo->Genre), 1, GENRE_LEN, pFile);
if (MP3_INFO_LENGTH != len)
{
return MP3_ERROR;
}

return MP3_OK;
}

int OutputMP3Info(MP3_INFO *pstMp3Info)
{
printf("\r\nTag : %s", pstMp3Info->Identify);
printf("\r\nTitle : %s", pstMp3Info->Title);
printf("\r\nArtist : %s", pstMp3Info->Artist);
printf("\r\nAlbum : %s", pstMp3Info->Album);
printf("\r\nYear : %s", pstMp3Info->Year);
printf("\r\nComment: %s", pstMp3Info->Comment);

return MP3_OK;
}

测试:
MP3 file: E:\Project\MP3\test.MP3
Tag : TAG
Title : TrackTitle
Artist : ArtistName
Album : AlbumTitle
Year : 2012
Comment: This is a comment
笑知亿3
推荐于2018-05-06 · TA获得超过1.1万个赞
知道小有建树答主
回答量:1396
采纳率:72%
帮助的人:303万
展开全部
C文件:
#include <string.h>

#define MP3_OK 1
#define MP3_ERROR 1

FILE *OpenMp3File(char *pFileName);
int ReadMP3Info(FILE *pFile, MP3_INFO *pstInfo);
int OutputMP3Info(MP3_INFO *pstMp3Info);

int main(int argc, char* argv[])
{
FILE *pFile = NULL;
MP3_INFO stMp3Info = {0};
char *pfname = "E:\\Project\\MP3\\test.MP3";

pFile = OpenMp3File(pfname);
if (NULL == pFile)
{
return MP3_ERROR;
}

ReadMP3Info(pFile, &stMp3Info);

printf("\r\nMP3 file: %s", pfname);
OutputMP3Info(&stMp3Info);

printf("Hello World!\n");
return MP3_OK;
}

FILE *OpenMp3File(char *pFileName)
{
FILE *pFile = NULL;
pFile = fopen(pFileName,"rb");
if (NULL==pFile)
{
printf("open read file error!!");
return NULL;
}

return pFile;
}

int ReadMP3Info(FILE *pFile, MP3_INFO *pstInfo)
{
int len = 0;
if ((NULL == pFile) || (NULL == pstInfo))
{
return MP3_ERROR;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-05-25
展开全部
先把某个mp3文件用 winhex 程序解析出来
然后开始自己慢慢研究,你会有收获的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式