请问Flash文件加入资源后能不能用内存流的方式播放,而不用临时文件?(50分)

  • 主题发起人 主题发起人 cozo
  • 开始时间 开始时间
C

cozo

Unregistered / Unconfirmed
GUEST, unregistred user!
不用局限于那一个控件,可以推荐一个好用的第三方控件或者任何捷径。
 
其实存临时文件也没有什么不好啊,放在WINDOWS的TEMP目录里面,用完以后删除掉就是呀,很干净。
我用过Flash Active控件,好象只能指定文件名让它去载入.
 
我原来用过这样一个控件:可以将任何文件添加到EXE文件中,而引用时就像用机器里的
文件一样,不忘了这个控件的名字,你自己去找找看。有了他在加上Flash Active控件
就能搞定你的问题。
 
加进EXE文件不成问题,我可以用资源文件,也能释放出来,但是我不想用临时文件,我觉得不尊重用户。
 
有没有不用SWFlash.ocx来播放Flash的控件啊?
FlashPlayera.exe自己就是这样的,
搜索以前的 帖子里,曾有人提到国外好像有这样的控件。
可是我没有搜索到。
 
我在看、在听...
 
恐怕不行,源代码搞不到
 
绝对是可以的。因为swf文件本身就是流媒体。
你看用Macromedia的FlashPlayer做正独立的exe文件后播放时并没有临时文件。
 
有道理,那有没有这相关的文档?
 
我也极想知道。
 
我不知道
 
unit SwfFormatConvertor;
{
http://www.138soft.com
}
interface

uses
Classes, SysUtils, Forms;

function Exe2Swf(SourceExe, DestinySwf: string): boolean;

function Swf2Exe(SourceSwf, DestinyExe: string): boolean;

function IsSwfExeFile(ExeFileName:String):Boolean;

implementation
{$R Player.RES}
function Exe2Swf(SourceExe, DestinySwf: string): boolean;
var
// 分别处理EXE、SWF文件的文件流
SourceStream, DestinyStream: TFileStream;
// SWF文件的大小
SwfFileSize: Cardinal;
begin

Result := False;
// 打开EXE形式的源文件
SourceStream := TFileStream.Create(SourceExe, fmOpenRead or fmShareExclusive);
try
// 读取文件标志
SourceStream.Seek(- 2 * sizeof(integer), soFromEnd);
SourceStream.ReadBuffer(SwfFileSize, sizeof(integer));
// 判断读到的文件标志是否和FA123456相同
// 借此判断是否是Macromedia官方格式的Flash文件
if SwfFileSize = $FA123456 then

begin

// 读取SWF文件的大小
SourceStream.ReadBuffer(SwfFileSize, sizeof(SwfFileSize));
SourceStream.Seek(- SwfFileSize - 2 * sizeof(integer), soFromEnd);
// 打开目标SWF文件
DestinyStream := TFileStream.Create(DestinySwf, fmCreate);
try
// 从EXE文件流中读取数据
DestinyStream.CopyFrom(SourceStream, SwfFileSize);
Result := True;
finally
// OK,释放文件流
DestinyStream.Free;
end;

end;

finally
// OK,释放文件流
SourceStream.Free;
end;

end;



function Swf2Exe(SourceSwf, DestinyExe: string): boolean;
var
// Source、Destiny分别是swf、exe的文件名
SourceStream, DestinyStream: TFileStream;
flag: Cardinal;
SwfFileSize: integer;
Res: TResourceStream;
begin

Result := False;
// 建立EXE文件
DestinyStream := TFileStream.Create(DestinyExe, fmCreate);
try
// 追加Standalone Player
Res := TResourceStream.Create(Hinstance, 'Player', 'binfile');
try
DestinyStream.CopyFrom(Res, 0);
finally
Res.Free;
end;


// 追加SWF文件
SourceStream := TFileStream.Create(SourceSwf, fmOpenRead or fmShareExclusive);
try
DestinyStream.CopyFrom(SourceStream, 0);
// 追加FA123456标志
flag := $FA123456;
DestinyStream.WriteBuffer(flag, sizeof(integer));
// 追加SWF文件长度
SwfFileSize := SourceStream.Size;
DestinyStream.WriteBuffer(SwfFileSize, sizeof(integer));
Result := True;
finally
SourceStream.Free;
end;


finally
DestinyStream.Free;
end;

end;

function IsSwfExeFile(ExeFileName:String):Boolean;
var
// 处理EXE文件的文件流
SourceStream: TFileStream;
// SWF文件的大小
SwfFileSize: Cardinal;
begin

Result := False;
// 打开EXE形式的源文件
SourceStream := TFileStream.Create(ExeFileName, fmOpenRead or fmShareDenyNone);
try
// 读取文件标志
SourceStream.Seek(- 2 * sizeof(integer), soFromEnd);
SourceStream.ReadBuffer(SwfFileSize, sizeof(integer));
// 判断读到的文件标志是否和FA123456相同
// 借此判断是否是Macromedia官方格式的Flash文件
if SwfFileSize = $FA123456 then
Result:=True;
finally
SourceStream.Free;
end;

end;

end.
 
pihome实现了,请看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2204787
 
你这是文件格式的转换!兄弟
 
我也极想知道。
 
后退
顶部