`
duyouhua1214
  • 浏览: 238337 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C读取MP3头部和尾部信息的代码

 
阅读更多

Mp3的文件头长10字节.主要保存ID3、ID3版本和副版本信息,以及Flag和帧长的信息。


Mp3尾部128字节大小的空间中包含了Header(尾部头,4字节),Title(歌曲名称,30字节),Artilst(艺术家30字节),Album(专辑,30字节),Year(发行年份,4字节),Comment(评论,30字节),Conre(?,1字节)

需要使用的函数 fseek() fread()

代码如下:

 

#include <stdio.h>
FILE *fp;
// Tag_header__Start
struct Tag_header{
char Header[3]; // It must be 'ID3'
   char ver; // The version of ID3
   char ReVer; // the subversion of ID3
   char Flag;
   char Size[4];
   };
// Tag_header__End

// Tag_Trailer__Start
struct Tag_Trailer{
char Header[3];
char Title[30];
char Artist[30];
char Album[30];
char Year[4];
char Comment[30];
char Cenre[1];};
// Tag_GetTrailer__End


struct Tag_header Mp3Header;
struct Tag_Trailer Mp3Trailer;

main()
{

// 01.mp3是我测试时用的MP3的名称


fp = fopen("01.mp3","r+");
if(fp == NULL)
{
   printf("No such file");
}
else
{
   Tag_GetHeader();
   Tag_GetTrailer();
}

printf("\n%s\n",Mp3Trailer.Title);
printf("%s\n",Mp3Trailer.Artist);
printf("%s\n",Mp3Trailer.Album);
printf("%s\n",Mp3Trailer.Year);
printf("%s\n",Mp3Trailer.Comment);
fclose(fp);
}

void Tag_GetTrailer()
{
// Get Header
fseek(fp,-128,SEEK_END);
fread(Mp3Trailer.Header,3,1,fp);
// Get Title
fseek(fp,-125,SEEK_END);
fread(Mp3Trailer.Title,30,1,fp);
// Get Artist
fseek(fp,-95,SEEK_END);
fread(Mp3Trailer.Artist,30,1,fp);
// Get Album
fseek(fp,-65,SEEK_END);
fread(Mp3Trailer.Album,30,1,fp);
// Get Year
fseek(fp,-35,SEEK_END);
fread(Mp3Trailer.Year,4,1,fp);
// Get Comment
fseek(fp,-31,SEEK_END);
fread(Mp3Trailer.Comment,30,1,fp);
// Get Cenre
fseek(fp,-1,SEEK_END);
fread(Mp3Trailer.Cenre,1,1,fp);
}
void Tag_GetHeader()
{
// Get ID3 Tag
fseek(fp,0,SEEK_SET);
fread(Mp3Header.Header,sizeof(Mp3Header.Header),1,fp); 
// Get ID3 Version
fseek(fp,3,SEEK_CUR);
fread(Mp3Header.ver,sizeof(Mp3Header.ver),1,fp);
// Get ID3 Revision
fseek(fp,4,SEEK_CUR);
fread(Mp3Header.ReVer,sizeof(Mp3Header.ReVer),1,fp);
// Get ID3 Flag
fseek(fp,5,SEEK_CUR);
fread(Mp3Header.Flag,sizeof(Mp3Header.Flag),1,fp);
// Get ID3 Size
fseek(fp,6,SEEK_CUR);
fread(Mp3Header.Size,sizeof(Mp3Header.Size),1,fp);

}
分享到:
评论

相关推荐

    学生信息管理系统C语言源代码学生信息管理系统C语言源代码

    根据提供的信息,我们可以了解到这是一段用C语言编写的“学生信息管理系统”的源代码。该系统主要用于管理学生的个人信息,如学号、姓名、性别、年龄、总分等,并且能够进行数据的添加、保存和输出等功能。下面我们...

    gzip.rar_C gzip源码_c语言gzip_gzip压缩_gzip解压_poetryfem

    3. 添加文件头和尾部信息:gzip格式的文件在压缩数据前有一个包含文件名、时间戳和其他元数据的头部,而在数据后有一个校验和字段,用于验证解压缩后数据的完整性。 4. 写入输出文件:将压缩后的数据以及头尾部信息...

    易语言源码易语言MP3文件信息摘要源码.rar

    由于ID3标签位于文件头部或尾部,可能需要跳过音频数据部分,直接读取标签区域。 5. 字符串处理: 解析ID3标签通常涉及查找特定的字符串标记,然后提取标记后的信息。易语言提供了“字符串查找”、“字符串截取”...

    ringbuffer.zip

    否则,读取头部数据,并更新头部指针。 4. **溢出处理**:当写入操作导致头部追上尾部时,需要进行溢出处理。这通常意味着丢弃最早写入的数据(称为“老化”或“覆盖”),或者停止写入直到有空间可用。 5. **空闲...

    C语言:基于c代码实现的二维单调队列

    在这段C语言代码中,实现了二维单调队列的基本概念和应用场景。下面将从代码结构和功能上详细讲解其知识点。 首先,代码的结构分为几个部分:包含头文件、定义全局变量、定义结构体、主函数中实现逻辑和计算最小值...

    数据结构C语言源代码.doc

    在给出的代码中,`createlist()`函数首先创建一个空链表,然后不断读取用户输入的字符,将每个字符作为新的节点数据,并将新节点插入到链表头部。这种方法的优点是插入操作简单,但若频繁插入,会导致已插入的元素...

    C语言实现栈空间共享代码

    这段代码是用C语言编写的,用于实现一个双栈结构,即在一个数组中存储两个栈,一个从数组头部开始,一个从数组尾部开始,以节省空间。代码的主要功能如下: 定义了一个判断函数judge(),用于检查是否栈满,即是否top...

    c语言程序设计链表信息管理

    本实验报告和代码库主要围绕“链表信息管理”这一主题展开,旨在通过实际编程实践帮助学习者深入理解链表的工作原理及其在实际问题中的应用。 链表不同于数组,它不需要连续的内存空间来存储元素,每个节点包含数据...

    C语言学生管理系统课程设计报告书

    2. 记录的插入:在链表中添加新的学生信息,可以通过在链表的头部、尾部或根据特定条件(如ID匹配)进行插入。 3. 记录的修改:根据用户提供的ID或其他标识找到特定的节点,并更新其信息。 4. 记录的删除:根据...

    C语言实现LZ编码

    - 解码时,从输入文件读取码字,根据码字的长度和位置信息在滑动窗口中查找并复制相应的字符序列,重建原始数据。解码过程同样需要队列操作和滑动窗口管理。 8. **效率优化**: - 实现时可以考虑使用哈希表来加速...

    华为OD机试C卷- 贪吃的猴子(Java & JS & Python & C).md-私信看全套OD代码及解析

    Java代码中首先读取输入并初始化数组和变量,然后通过循环计算出从两端取香蕉的最大数量。 - **Python代码示例**: Python代码同样实现了上述逻辑,但使用了更简洁的语法,例如列表推导式和内置函数。 - **...

    约瑟夫环C语言实现代码

    ### 约瑟夫环C语言实现代码解析 #### 知识点一:约瑟夫环问题背景与定义 约瑟夫环问题是一个经典的计算机科学问题,源自于犹太历史学家约瑟夫斯所记载的一个事件。问题描述如下:n个人围成一个圈,从某个人开始报...

    模拟LRU页面置换算法c语言程序

    4. 如果页面不在物理块中,且物理块已满,从链表尾部移除最近最少使用的页面(即最久未被访问的页面),然后将新页面添加到链表头部。 5. 记录每次淘汰操作,统计缺页次数。 6. 最后,程序输出四个物理块中存储的...

    笑话全站程序源代码 asp

    3. **Inc.asp**:这个文件很可能是包含了一些共用的函数或变量,比如头部和尾部的HTML代码、用户登录状态的检查或者全局设置,这样可以在多个页面之间复用代码,提高效率。 4. **book.asp**:可能代表一个“笑话...

    约瑟夫实验代码 c语言

    ### 约瑟夫实验代码 C语言解析 #### 一、背景介绍 约瑟夫问题是一个经典的计算机科学问题,源自于犹太历史学家约瑟夫斯的一个故事。在这个问题中,人们围成一个圈,并按照一定的规则报数,每轮报数到指定数字的人将...

    链式队列的算法c代码

    ### 链式队列的算法C代码解析 #### 一、引言 在计算机科学领域,队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。队列可以分为数组实现的循环队列和链表实现的链式队列。本文将详细介绍链式队列的算法...

    JPEG格式编码示例代码

    - `jpg_enc.ncb`、`jpg_enc.opt` 和 `jpg_enc.plg` 文件是Visual Studio的辅助工程文件,保存了用户界面状态、编译优化信息和调试设置。 - `src` 文件夹通常包含实际的源代码文件,如C++或C语言的源码。 - `SI` ...

    gzipcode.rar

    头部包含了时间戳、文件权限等元信息,而尾部则包含了一个CRC32校验和,用于验证数据的完整性和正确性。 DEFLATE算法是GZIP的核心,它结合了LZ77滑动窗口压缩(寻找重复的字符串并用长度和偏移量表示)和霍夫曼编码...

    C 语言学生 通讯管理系统

    2. 插入学生信息:在链表的头部或尾部插入新节点,需要创建新的节点并设置其数据,然后更新指针关系。 3. 查找学生信息:遍历链表,根据学号或姓名找到对应的学生信息。 4. 更新学生信息:找到要修改的学生节点,...

    C语言,消费者和生产者模式

    4. **数据队列**:在C语言中,可以使用结构体来定义队列,包括队列的头部、尾部指针以及元素数组。当生产者将数据放入队列时,它会更新队列的尾部指针;消费者取出数据时,更新头部指针。 5. **线程创建与销毁**:`...

Global site tag (gtag.js) - Google Analytics