Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110947
  • 博文数量: 11
  • 博客积分: 282
  • 博客等级: 二等列兵
  • 技术积分: 263
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-09 20:34
文章分类

全部博文(11)

文章存档

2012年(11)

分类: C/C++

2012-06-04 14:56:32

      

        对于C语言而言, mp3格式也是一种文件,它只要一"rb"方式打开还是字符,所以对它的操作即

对文件的操作.但是它的组成很富杂的.

    

点击(此处)折叠或打开

  1.  MP3文件由多个帧组成,也就是说帧是MP3音乐文件的最小组成单位。每个帧又由帧头和帧数据组成。每个帧头长4字节。其数据结构如下:
  2.   typedef struct _tagHeader {
  3.   unsigned int sync:12; //同步信息
  4.   unsigned int version:1; //版本
  5.   unsigned int layer:2; //层
  6.   unsigned int error_protection:1; //CRC校正
  7.   unsigned int bit_rate_index:4; //位率索引
  8.   unsigned int sample_rate_index:2; //采样率索引
  9.   unsigned int padding:1; //空白字
  10.   unsigned int extension:1; //私有标志
  11.   unsigned int channel_mode:2; //立体声模式
  12.   unsigned int mode extension:2; //保留
  13.   unsigned int copyright:1; //版权标志
  14.   unsigned int original:1; //原始媒体
  15.   unsigned int emphasis:2; //强调方式
  16.   } HEADER, *LPHEADER;
  17.   其中帧同步标记为0xFFF
文件mp3格式详解 参考以下网址.
          
          一个MPEG音频文件是由许多的称为帧的较小部分组成的,通常,帧是独立的组成部分.每一帧都拥有自己的头和音频信息.没有头文件.所以,我们可以剪切MPEG文件的任何部分并且能够正常播放.所以我们可以把它当做一个普通文件来进行操作.但是在layer111中并不是100%正确的.这是因为在Layer111文件的数据组织中,帧常常是相互关联的并且不能那样随意裁切.
     
         以下是我写的代码

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5.     
  6.     FILE*fp_write,*fp_read;
  7.     char*buffer=NULL;
  8.    
  9.       buffer = malloc(5771646);

             //打开一个你系统有的音频文件,并且指定路径. 
  1.     fp_read=fopen("/home/hanwei/桌面/春天里.mp3","rb"); 
  2.                               
  3.     if(fp_read==NULL)
  4.     {
  5.         printf("read error! please check your path !\n");
  6.         exit(1);
  7.     }
           //让文件指针向后移动(裁切了前面这部分内容) ****note1******** 
  1.     fseek (fp_read,2000000,SEEK_SET);
  2.     
  3.     fp_write=fopen("/home/hanwei/桌面/test.mp3","wb");
  4.     fseek (fp_write,0,SEEK_SET);

  5.     fread(buffer,100,1,fp_read); //从fp_read文件中读取100个字符 存入buffer中
  6.     fwrite(buffer,100,1,fp_write); //将buffer中的内容写入 文件fd_write

  7.     fseek(fp_read,200,SEEK_CUR); //将文件指针从当前位置向后移动200个字节(裁切这部分内容)
  8.     fread(buffer,2000000,1,fp_read);
  9.     fwrite(buffer,2000000,1,fp_write);

  10.      /* 对文件指针进行移动,并且裁切,和上面一样
  11.      */
  12.     fseek(fp_read,1000000,SEEK_END);
  13.     fread(buffer,1000000,1,fp_read);
  14.     fwrite(buffer,1000000,1,fp_write);
  15.        
  16.        fclose(fp_read);
  17.     fclose(fp_write);
  18.     return 0;

  19.         
  20. }
             MPEG音频标签分为两种,一种是ID3v1,存在文件尾部,长度128字节,另一种是ID3v2,是对ID3v1的扩展,存在文件头部,长度不定。这个跟mp3音频标签存储方式有关系.下来就可以自己计算字节数随意截取了,就是C语言的各种文件操作的使用了.

如果你修改note1 这块 为           fseek(fp_read,0,SEEK_SET);
不从头裁切,如果你的音频标签是ID3v2,你会发现,播放歌曲时会出现 歌曲的 标题,作者.专辑 等
如果没有,说明你的MPEG音频标签是ID3v1,存在文件尾部的128字节.自己想办法修改指针移动,不减切这块,让它显示出来. 更多内容参考

        

        
阅读(3148) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~