| 
 
注册时间2004-8-27最后登录1970-1-1 
 | 
 
 
 楼主|
发表于 2004-12-27 23:00:00
|
显示全部楼层 
| /************************************************功  能:提取声音文件MP3 始  于:2003.7.20/13:51
 最  后:2003.7.20/16:08
 编写者:空小子
 规  则:Copyleft(自由)
 声  明:提取声音文件,目的在于爱好者个人研究,若随意
 公开或作商业用途,可能要受到法律制裁!
 ************************************************/
 #include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 #include<malloc.h>
 FILE        *fp1,      /*来源文件*/
 *fp2;         /*目标文件*/
 unsigned char FWS[3],      /*SWF文件标识*/
 *name = NULL,  /*文件名*/
 *strnum = NULL,/*转换成字符串的Stream Sounds数目*/
 *suffix = NULL,/*后缀名*/
 Stream_Info;   /*Stream Sounds的信息*/
 unsigned int  RECT_len,      /*RECT类型的长度*/
 Tag_ID = 1,    /*Tag标识*/
 Stream_num = 0; /*Stream Sounds的数目*/
 unsigned long TagData_len,   /*Tag数据部分的长度*/
 Stream_Startpos;/*Stream Sound数据开始位置*/
 /*Tag18与Tag45都是Stream Sound的标识,只有一点差异,所以一起处理*/
 void case18_45(int ID)
 {
 /*读完一个Stream Sound就关闭*/
 if (fp2!=NULL)
 {free(name); fclose(fp2);}
 /*跳过第一个信息*/
 fseek(fp1, 1, 1);
 /*得到第二个信息*/
 Stream_Info = fgetc(fp1);
 /*Tag18在这里有两个字节无用出,而Tag45则没有*/
 if (ID == 18) fseek(fp1, 2, 1);
 /*跳过长度信息*/
 fseek(fp1, 2, 1);
 /*得到后缀名*/
 if (Stream_Info >> 4) suffix = ".MP3";
 if (ID == 18) fseek(fp1, -2, 1);
 fseek(fp1, -4, 1);
 }
 main(int argc, char *argv[])
 {
 if(argc == 1)
 {
 printf("程序名 [来源文件名] [存放路径]");
 exit(0);
 }
 /*缺省路径*/
 if(argc == 2)
 {
 argv[2]="c:\\";
 }
 if((fp1 = fopen(argv[1],"rb")) == NULL)
 {
 printf("不能打开文件!");
 exit(1);
 }
 /*读取SWF文件标识,并判断是不是SWF文件*/
 fread(FWS, 3, 1, fp1);
 if (strcmp(FWS, "FWS") != 0)
 {
 printf("这不是SWF文件!");
 exit(1);
 }
 /*跳过用来存放版本信息和文件长度的字节*/
 fseek(fp1, 5, 1);
 /*读取RECT类型的第一字节*/
 RECT_len = fgetc(fp1);
 /*以为其高五位存放每项帧长度,所以按位右移把它取出*/
 RECT_len >>= 3;
 /*算出RECT类型的长度*/
 RECT_len = 5 + 4*RECT_len;
 for (; (RECT_len % 8) != 0; RECT_len++);
 RECT_len = RECT_len / 8 - 1;
 /*跳过帧频和总帧数的字节,它们分别用两字节存放*/
 fseek(fp1, RECT_len + 4, 1);
 /*开始查找Tag*/
 for (; Tag_ID != 0; fseek(fp1, TagData_len, 1))
 {
 /*读出Tag头*/
 fread(&Tag_ID, 2, 1, fp1);
 /*短型Tag长度,它存放在Tag头的低六位*/
 TagData_len = Tag_ID & 0x3F;
 /*若是长型Tag,则取出长度,它在Tag头的后四字节中*/
 if (TagData_len == 0x3F) fread(&TagData_len, 4, 1, fp1);
 /*Tag标识,它在Tag头的高十位*/
 Tag_ID >>= 6;
 /*Tag18,Tag45都是Stream Sound的标识*/
 switch(Tag_ID)
 {
 case 18: case18_45(18); break;
 case 45: case18_45(45); break;
 /*每个Tag19里存放着一段Stream Sound数据*/
 /*只要把它连接起来得出一个完整的Stream Sound*/
 case 19:
 {
 fseek(fp1, 4, 1);
 Stream_Startpos=ftell(fp1);
 /*打开第N个文件*/
 if (fp2 == NULL)
 {
 Stream_num++;
 itoa(Stream_num, strnum, 10);
 name=(char *)malloc(strlen(strnum) + strlen(argv[2]) + 11);
 strcpy(name,argv[2]);
 strcat(name,"Stream_");
 strcat(name,strnum);
 strcat(name,suffix);
 printf("%s\n", name);
 if((fp2 = fopen(name, "wb+")) == NULL)
 {
 printf("不能创建文件!");
 exit(1);
 }
 }
 /*一段一段的读出*/
 for (; ftell(fp1) != Stream_Startpos + TagData_len - 4;
 fputc(fgetc(fp1),fp2));
 fseek(fp1, -(TagData_len), 1);
 break;
 }
 case 0 : if (fp2 != NULL)
 {free(name); fclose(fp2);}
 }
 }
 if (Stream_num !=0)
 printf("一共有 %d 个Stream Sound! GOOD LUCK!\n", Stream_num);
 else
 printf("没有有发现Stream Sound! SORRY!\n");
 fclose(fp1);
 }
 
 | 
 |