提取swf中的声音文件程序源代码(Extract SWF sound file source code)提取swf中的声音文件程序源代码(Extract SWF sound file source code)
提取swf中的声音文件程序源代码(Extract SWF sound file source
code)
----------------以下为程序代码-------------
单位swfblue_u1;
接口
使用
Windows消息,SysUtils、变体、类、图形、控件、窗体,
对话框,actnlist,StdActns,StdCtrls,按钮,ShlObj,Zlib;
类型
tmain =类(...
提取swf中的声音文件程序源代码(Extract SWF sound file source code)
提取swf中的声音文件程序源代码(Extract SWF sound file source
code)
----------------以下为程序代码-------------
单位swfblue_u1;
接口
使用
Windows消息,SysUtils、变体、类、图形、控件、窗体,
对话框,actnlist,StdActns,StdCtrls,按钮,ShlObj,Zlib;
类型
tmain =类(平台)
b_open:TButton;
按钮:TButton;
标签:TLabel;
TLabel label2;
中的代码块为label3:TLabel;
opendialog1:topendialog;
label4:TLabel;
e_dir:TEdit;
speedbutton1:TSpeedButton;
程序b_openclick(发件人:TObject);
程序button3click(发件人:TObject);
程序formshow(发件人:TObject);
程序speedbutton1click(发件人:TObject);
私有的
{私人声明}
公众的
{公共声明}
文件长度:LongWord;/ / SWF文件尺寸
filebuf:数组的字节;/ /将SWF文件读入内存存放
结束;
VaR
主营:tmain;
实施
{ $ R * DFM }。
程序tmain b_openclick(发件人:TObject);
VaR
f:文件;
FWS:弦[ 3 ];//标示信息
版本:字节;/ / SWF文件版本号
b,B1,B2:字节;
巴夫:数组的字节;
帧率:/ /速率房;
帧数:词;/ /总帧数
S:字符串;
TagID:字;/ /标签标示
taglength:LongWord;/ /标签长度
currentpos,filelengthpos,tagpos,tmppos:整数;
/ / currentpos记录当前读写位置
/ / filelengthpos记录文件长度参数位置
/ / tagpos记录当前tagid位置
文件名:字符串;/ /存放SWF文件名(去掉了路径和扩展名)
L:LongWord;
SoundID:字;/ /事件声音的声音ID
SoundInfo:字节;/ /事件声音的声音信息
soundsamplecount:LongWord;
streamheadb1,streamheadb2:字节;/ /流声音的声音信息
StreamSoundSampleCount:字;
音乐档案:字符串;/ /记录生成的声音文件的扩展名,根据没有、ADPCM和MP3不同分为。WAV MP3和。
soundcount:词;/ /流声音类型的文件计数
文件名;
unknow1:字;
unknow2:LongWord;
开始
如果不opendialog1执行然后退出;
我不fmopenread:=;
assignfile(F,opendialog1。文件名);复位(F,1);
设置缓冲区的长度(filebuf,文件大小(F));
blockread(F,filebuf [ 0 ],文件大小(F));//将文件读入内存
关闭一个打开的文件(F);
/ /下面为读取SWF文件的文件头头部分
currentpos:= 0;
/ /读取'fws”标示
规定长度(FWS,3);移动(filebuf [ currentpos ],和[ 1 ],3);公司(currentpos,3);
如果FWS <> 'fws然后开始
设置缓冲区的长度(filebuf,0);
被(“该文件不是Flash SWF文件~”);
出口;
结束;
/ /读取版本号
移动(filebuf [ currentpos ],版本,Sizeof(版));公司(currentpos,Sizeof(版));
如果版本< 5然后开始
设置缓冲区的长度(filebuf,0);
被(“该SWF文件不是Flash 5以上版本,本程序当前仅识别Flash 5以上格式SWF文件~”);
出口;
结束;
/ /读取SWF文件长度
filelengthpos:= currentpos;
(filebuf [移动] Sizeof(currentpos,文件长度,文件长度));公司(currentpos、Sizeof(文件长度));
/ /读取Xmax,XMin,YMin,YMax
/ /这里仅读出此四个值的存储字节存放到buf中,没有计算它们的实际值
移动(filebuf [ currentpos ],B,1);公司(currentpos,1);
b = SHR 3;
/ /得到位数(位)
B2:= 5 + B2×4;而(B2 mod 8)<> 0做公司(B2);/ /计算共有多少位点数
B2:=(B2 DIV 8)- 1;/ /计算共有多少字节(字节)
规定长度(buf,B2 + 1);而[ 0 ]:= B;
移动(filebuf [ currentpos ],而是[ 1 ],B2);公司(currentpos,B2);
/ /读取为小数点前部分帧率,B2,B1为小数点后部分
移动(filebuf [ currentpos ]、B1、Sizeof(B1));公司(currentpos、Sizeof(B1));
移动(filebuf [ currentpos ]、B2、Sizeof(B2));公司(currentpos、Sizeof(B2));
S:= IntToStr(B2)+’。”+IntToStr(B1);
帧速率:= strtofloat(S);
/ /读取总帧数帧数
移动(filebuf [ currentpos ]、Sizeof(帧数,帧数));公司(currentpos、Sizeof(帧数));
/ /下面为读取SWF文件的文件内容标签部分
S:= opendialog1.filename;
S:= extractfilename(S);而Pos('。',S)<> 0做:=复制(S,1,POS('。',S)- 1);
文件名;
规定长度(buf,0);音乐档案:=“.wav”;soundcount:= 1;
重复
TagPos:= currentpos;
/ /读取tagid并得到taglength
移动(filebuf [ currentpos ],TagID,Sizeof(tagid));公司(currentpos,Sizeof(tagid));
taglength:= tagid美元和3f;
TagID:= tagid SHR 6;
/ /如果是longtag则读取下面的taglength
如果taglength = $ 3f然后开始
移动(filebuf [ currentpos ],TagLength,Sizeof(taglength));公司(currentpos,Sizeof(taglength));
结束;
案例TagID
24:开始
/ /是否有SWF保护设置
/ /如果有则将该标签去掉,将后面的标签搬过来覆盖掉tagid为24的部分
移动(filebuf [ currentpos + taglength ],filebuf [ tagpos ],文件长度-(currentpos + taglength)+ 1);
/ /相应的,要减去文件长度文件长度
文件长度:=文件长度-(Sizeof(tagid)+ taglength);
currentpos:= tagpos;
结束;
14:开始
/ /读取事件声音
移动(filebuf [ currentpos ],SoundID,Sizeof(soundid));公司(currentpos,Sizeof(soundid));
tmppos:= currentpos;
移动(filebuf [ currentpos ],SoundInfo,Sizeof(soundinfo));公司(currentpos,Sizeof(soundinfo));
移动(filebuf [ currentpos ],SoundSampleCount,Sizeof(soundsamplecount));公司(currentpos,Sizeof(soundsamplecount));
案例soundinfo SHR 4
0::=“wav”;
2:S =;
结束;
L:= TagLength Sizeof(soundid);
/ /将标签的数据部分作为声音数据存盘
assignfile(FW,e_dir。文字+文件名+ '_sound ' +IntToStr
(soundid)+ S);重写(FW,1);
blockwrite(FW,filebuf [ tmppos ],L);
关闭一个打开的文件(FW);
currentpos:= tmppos + L;
结束;
18:开始
/ /读取流声音的数据头
// id = 18属于soundstreamhead
/ /先检查前面是否已有了流声音,如果有则先存盘
如果长度(BUF)<> 0然后开始
assignfile(FW,e_dir。文字+文件名+ '_streamsound ' +IntToStr
(SoundCount)+音乐档案);重写(FW,1);
blockwrite(FW,但是[ 0 ],长度(BUF));
关闭一个打开的文件(FW);
公司(soundcount);
结束;
规定长度(buf,0);
移动(filebuf [ currentpos ],streamheadb1,sizeof(streamheadb1));公司(currentpos,sizeof(streamheadb1));
移动(filebuf [ currentpos ],streamheadb2,sizeof(streamheadb2));
公司(currentpos,sizeof(streamheadb2));
移动(filebuf [ currentpos ],StreamSoundSampleCount,Sizeof(streamsoundsamplecount));公司(currentpos,Sizeof(streamsoundsamplecount));
1 /此处有个unknow1数据,占16位,没有用处
移动(filebuf [ currentpos ],unknow1,Sizeof(unknow1));公司(currentpos,Sizeof(unknow1));
案例streamheadb2 SHR 4
0:音乐档案:=“wav”;
2::=“MP3音乐文件;
结束;
结束;
45:开始
/ /读取流声音的数据头
// id = 45属于soundstreamhead2
/ /先检查前面是否已有了流声音,如果有则先存盘
如果长度(BUF)<> 0然后开始
assignfile(FW,e_dir。文字+文件名+ '_streamsound ' +IntToStr
(SoundCount)+音乐档案);重写(FW,1);
blockwrite(FW,但是[ 0 ],长度(BUF));
关闭一个打开的文件(FW);
公司(soundcount);
结束;
规定长度(buf,0);
移动(filebuf [ currentpos ],streamheadb1,sizeof(streamheadb1));公司(currentpos,sizeof(streamheadb1));
移动(filebuf [ currentpos ],streamheadb2,sizeof(streamheadb2));公司(currentpos,sizeof(streamheadb2));
移动(filebuf [ currentpos ],StreamSoundSampleCount,Sizeof(streamsoundsamplecount));公司(currentpos,Sizeof(streamsoundsamplecount));
/ /不同于ID = 18,此处没有unknow1数据
案例streamheadb2 SHR 4
0:音乐档案:=“wav”;
2::=“MP3音乐文件;
结束;
结束;
19:开始
1 /将每帧(位于每1个ID = 19的标签数据中)的声音数据读取并组合在一起
1 /此处有个unknow2数据,占32位,没有用处
移动(filebuf [ currentpos ],unknow2,Sizeof(unknow2));公司(currentpos,Sizeof(unknow2));
L:=长度(BUF);/ /求出缓冲区现在长度
规定长度(buf,L + TagLength Sizeof(unknow2));//将缓冲区加长
/ /顺序存放
移动(filebuf [ currentpos ],而是[我],TagLength Sizeof(unknow2));公司(currentpos,TagLength Sizeof(unknow2));
结束;
0:开始
/ /结尾处检查前面是否有流声音,如果有则存盘
如果长度(BUF)<> 0然后开始
assignfile(FW,e_dir。文字+文件名+ '_streamsound ' +IntToStr
(SoundCount)+音乐档案);重写(FW,1);
blockwrite(FW,但是[ 0 ],长度(BUF));
关闭一个打开的文件(FW);
结束;
结束;
其他currentpos:= currentpos + taglength;
结束;
直到tagid = 0;
设置缓冲区的长度(filebuf,0);
规定长度(buf,0);
结束;
程序tmain button3click(发件人:TObject);
开始
关闭;
结束;
程序tmain formshow(发件人:TObject);
VaR
S:字符串;
开始
S:= application.exename;
S:=返回特定文件的路径(S);
如果s(长度)为“\\”,则为;
e_dir。正文:= S;
结束;
程序tmain speedbutton1click(发件人:TObject);
VaR
S:字符串;
信息:tbrowseinfo;
巴夫:阵[ 0 .. max_path ]字符;
P:pitemidlist;
开始
fillchar(BUF [ 0 ],max_path + 1,0);
信息开始
hwndowner:=处理;
pidlroot:= nil;
pszdisplayname:= buf;
lpsztitle:=“:”选择声音文件生成目录;
bif_returnonlyfsdirs ulFLags:=;
LPFN:= nil;
结束;
P:=程序(信息);
如果巴夫<>”开始
shgetpathfromidlist(P,buf);
S:= BUF的长度;如果[(S)] < > '然后S = S + ';
e_dir。正文:= S;
结束;
结束;
结束。
本文档为【提取swf中的声音文件程序源代码(Extract SWF sound file source code)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。