对于C语言而言, mp3格式也是一种文件,它只要一"rb"方式打开还是字符,所以对它的操作即
对文件的操作.但是它的组成很富杂的.
- MP3文件由多个帧组成,也就是说帧是MP3音乐文件的最小组成单位。每个帧又由帧头和帧数据组成。每个帧头长4字节。其数据结构如下:
- typedef struct _tagHeader {
- unsigned int sync:12; //同步信息
- unsigned int version:1; //版本
- unsigned int layer:2; //层
- unsigned int error_protection:1; //CRC校正
- unsigned int bit_rate_index:4; //位率索引
- unsigned int sample_rate_index:2; //采样率索引
- unsigned int padding:1; //空白字
- unsigned int extension:1; //私有标志
- unsigned int channel_mode:2; //立体声模式
- unsigned int mode extension:2; //保留
- unsigned int copyright:1; //版权标志
- unsigned int original:1; //原始媒体
- unsigned int emphasis:2; //强调方式
- } HEADER, *LPHEADER;
- 其中帧同步标记为0xFFF。
文件mp3格式详解 参考以下网址.
一个MPEG音频文件是由许多的称为帧的较小部分组成的,通常,帧是独立的组成部分.每一帧都拥有自己的头和音频信息.没有头文件.所以,我们可以剪切MPEG文件的任何部分并且能够正常播放.所以我们可以把它当做一个普通文件来进行操作.但是在layer111中并不是100%正确的.这是因为在Layer111文件的数据组织中,帧常常是相互关联的并且不能那样随意裁切.
以下是我写的代码
- #include<stdio.h>
- #include<stdlib.h>
- int main()
- {
-
- FILE*fp_write,*fp_read;
- char*buffer=NULL;
-
- buffer = malloc(5771646);
//打开一个你系统有的音频文件,并且指定路径.
- fp_read=fopen("/home/hanwei/桌面/春天里.mp3","rb");
-
- if(fp_read==NULL)
- {
- printf("read error! please check your path !\n");
- exit(1);
- }
//让文件指针向后移动(裁切了前面这部分内容) ****note1********
- fseek (fp_read,2000000,SEEK_SET);
-
- fp_write=fopen("/home/hanwei/桌面/test.mp3","wb");
- fseek (fp_write,0,SEEK_SET);
- fread(buffer,100,1,fp_read); //从fp_read文件中读取100个字符 存入buffer中
- fwrite(buffer,100,1,fp_write); //将buffer中的内容写入 文件fd_write
- fseek(fp_read,200,SEEK_CUR); //将文件指针从当前位置向后移动200个字节(裁切这部分内容)
- fread(buffer,2000000,1,fp_read);
- fwrite(buffer,2000000,1,fp_write);
- /* 对文件指针进行移动,并且裁切,和上面一样
- */
- fseek(fp_read,1000000,SEEK_END);
- fread(buffer,1000000,1,fp_read);
- fwrite(buffer,1000000,1,fp_write);
-
- fclose(fp_read);
- fclose(fp_write);
- return 0;
-
- }
MPEG音频标签分为两种,一种是ID3v1,存在文件尾部,长度128字节,另一种是ID3v2,是对ID3v1的扩展,存在文件头部,长度不定。这个跟mp3音频标签存储方式有关系.下来就可以自己计算字节数随意截取了,就是C语言的各种文件操作的使用了.
如果你修改note1 这块 为 fseek(fp_read,0,SEEK_SET);
不从头裁切,如果你的音频标签是ID3v2,你会发现,播放歌曲时会出现 歌曲的 标题,作者.专辑 等
如果没有,说明你的MPEG音频标签是ID3v1,存在文件尾部的128字节.自己想办法修改指针移动,不减切这块,让它显示出来. 更多内容参考
阅读(3195) | 评论(0) | 转发(1) |