以内存流的方式播放FLASH
来源:互联网 发布:java 解压缩文件夹 编辑:程序博客网 时间:2024/04/27 14:45
以前想在程序中嵌入FLASH,flash文件不能以资源的方式嵌入到文件中,也就是flash要以单独的文件一起发布,有点不爽,也有方法通过管道技术实现内存流的方式播放,但随着flash的升级,这种方法也不行了。搜索google,一些商业性的控件实现了以流的方式来播放,要钱的,下载DEMO,反汇编跟踪,功力有限,半途而废,再搜,哈哈找到TFlashPlayerControl源码,贴出其中关键的代码
procedure TFlashPlayerControl.LoadMovieFromStream(Layer:Integer;Src: TStream);
var
unCompress: TStream;
Mem, Mem2: TMemoryStream;
SRCSize: longint;
PersistStream: IPersistStreamInit;
SAdapt: TStreamAdapter;
ISize: int64;
B: byte;
ASign: array [0..2] of char;
isCompress: boolean;
ZStream: TDeCompressionStream;
rc:TRect;
hdcScreen,hdcMem:HDC;
begin
rc := ClientRect;
hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
hdcMem:=CreateCompatibleDC(hdcScreen);
{$IFDEF DEMO_VERSION}
DrawText(hdcMem, PChar('DEMO VERSION'), -1, rc, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
{$ENDIF}
Src.Read(ASign, 3);
isCompress := ASign = 'CWS';
if isCompress then
begin
unCompress := TMemoryStream.Create;
ASign := 'FWS';
unCompress.Write(ASign, 3);
unCompress.CopyFrom(Src, 1);
SRC.Read(SRCSize, 4);
unCompress.Write(SRCSize, 4);
ZStream := TDeCompressionStream.Create(Src);
try
unCompress.CopyFrom(ZStream, SRCSize - 8);
finally
ZStream.free;
end;
unCompress.Position := 0;
end else
begin
Src.Position := Src.Position - 3;
SRCSize := Src.Size - Src.Position;
unCompress := Src;
end;
EmbedMovie := false;
FOleObject.QueryInterface(IPersistStreamInit, PersistStream);
PersistStream.GetSizeMax(ISize);
Mem := TMemoryStream.Create;
Mem.SetSize(ISize);
SAdapt := TStreamAdapter.Create(Mem);
PersistStream.Save(SAdapt, true);
SAdapt.Free;
Mem.Position := 1;
Mem2 := TMemoryStream.Create;
B := $66;
Mem2.Write(B, 1);
Mem2.CopyFrom(Mem, 3);
Mem2.Write(SRCSize, 4);
Mem2.CopyFrom(unCompress, SRCSize);
Mem2.CopyFrom(Mem, Mem.Size - Mem.Position);
Mem2.Position := 0;
SAdapt := TStreamAdapter.Create(Mem2);
PersistStream.Load(SAdapt);
SAdapt.Free;
Mem2.Free;
Mem.Free;
PersistStream := nil;
if isCompress then unCompress.Free;
end;
看到 {$IFDEF DEMO_VERSION} 了吗?以后TFlashPlayerControl发布新版本就可以很轻松的破解了,哈哈
------------------
added 2008.5.21
今天看 Delphi SWF SDK 时候看到他的控件 TShockwaveFlashEx,而且是源码是公开的,里面就有
汗一个。
看来在内存中播放flash早就公开了,国内研究这个不多。付上源码
procedure TShockwaveFlashEx.LoadMovieFromStream(Src: TStream);
var
unCompress: TStream;
Mem, Mem2: TMemoryStream;
SRCSize: longint;
PersistStream: IPersistStreamInit;
SAdapt: TStreamAdapter;
ISize: int64;
B: byte;
ASign: array [0..2] of char;
isCompress: boolean;
ZStream: TDeCompressionStream;
begin
// prepare src movie
Src.Read(ASign, 3);
isCompress := ASign = 'CWS';
if isCompress then
begin
unCompress := TMemoryStream.Create;
ASign := 'FWS';
unCompress.Write(ASign, 3);
unCompress.CopyFrom(Src, 1); // version
SRC.Read(SRCSize, 4);
unCompress.Write(SRCSize, 4);
ZStream := TDeCompressionStream.Create(Src);
try
unCompress.CopyFrom(ZStream, SRCSize - 8);
finally
ZStream.free;
end;
unCompress.Position := 0;
end else
begin
Src.Position := Src.Position - 3;
SRCSize := Src.Size - Src.Position;
unCompress := Src;
end;
// store "template"
EmbedMovie := false;
FOleObject.QueryInterface(IPersistStreamInit, PersistStream);
PersistStream.GetSizeMax(ISize);
Mem := TMemoryStream.Create;
Mem.SetSize(ISize);
SAdapt := TStreamAdapter.Create(Mem);
PersistStream.Save(SAdapt, true);
SAdapt.Free;
// insetr movie to "template"
Mem.Position := 1;
Mem2 := TMemoryStream.Create;
B := $66; // magic flag: "f" - embed swf; "g" - without swf;
Mem2.Write(B, 1);
Mem2.CopyFrom(Mem, 3);
Mem2.Write(SRCSize, 4);
Mem2.CopyFrom(unCompress, SRCSize);
Mem2.CopyFrom(Mem, Mem.Size - Mem.Position);
// load activeX data
Mem2.Position := 0;
SAdapt := TStreamAdapter.Create(Mem2);
PersistStream.Load(SAdapt);
SAdapt.Free;
// free all
Mem2.Free;
Mem.Free;
PersistStream := nil;
if isCompress then unCompress.Free;
end;
- 以内存流的方式播放FLASH
- C#在内存中播放Flash
- hqldb数据库在java程序中以内存方式启动
- Tachyon--以内存为核心的开源分布式存储系统
- Tachyon--以内存为核心的开源分布式存储系统
- 以内存为核心的开源分布式存储系统
- iOS以内聚的方式添加控件
- 漂亮的flash播放器
- 播放Flash的用户控件
- 以内存形式运行Xcode
- ios存数据的方式
- 播放视频的方式
- 利用文件io流的方式存储(存到内部与存到SD卡)
- [转载]使用EasyRTMP推送RTMP流flash播放器无法正常播放的问题解决
- Flash播放
- 播放Flash
- [Flash]NAND Flash的寻址方式(转)
- 安装最新的FLASH播放器
- OpenSolaris的文件系统分配
- 可爱的猫猫-发布测试
- 日本参议院选举结果揭晓
- JSTL简介 ---Core标签库
- Oracle连接
- 以内存流的方式播放FLASH
- 我的日记
- 学习.Net的经典网站(转)
- Ghost技巧 几秒钟格式化120G硬盘
- 浅谈C#托管程序中的资源释放问题
- asp.net java 的十大关键技术
- i like the ad of independently.
- 游戏内存修改原理
- 博客营销的十二大绝招:如何用博客营销