- 注册时间
- 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);
}
|
|