寻求将从PPT转化为SWF的思路

yaoweibin 2005-07-01 11:01:43
刚刚接了一个任务,要求做一个类似浏览器里面的PPT,能够将课件,视频,音频融合在一起,由于是用来做Linux培训,他要求这个软件在Linux下也能运行,所以只能用Java写。我觉得先用ppt做好,然后转化成swf后在浏览器内播放比较合适,客户端不用特殊要求,一般的浏览器都装有flash的插件,而ppt制作课件的能力是最快最强的。现在还在构思阶段,是否用其他更好的办法?
在网上有类似的软件,不过都是C写的,而且基本上都要钱,没有源代码
下面的网页列出了20种类似的软件
http://www.masternewmedia.org/2004/04/14/powerpoint_to_flash_conversion_tools.htm
我现在就感觉没有思路,由于对Java也不太熟,不知道具体能怎么去实现它。
谢谢关注,随便给点建议都可以
...全文
426 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoweibin 2005-07-04
  • 打赏
  • 举报
回复
'"真我的风采"写的
'"真我的风采"写的
'把下面的保存为Form3.frm
VERSION 5.00
Begin VB.Form Form3
BorderStyle = 1 'Fixed Single
Caption = "SWF Extractor (byte search)"
ClientHeight = 4095
ClientLeft = 45
ClientTop = 330
ClientWidth = 5325
LinkTopic = "Form3"
MaxButton = 0 'False
ScaleHeight = 4095
ScaleWidth = 5325
StartUpPosition = 1 '所有者中心
Begin VB.CommandButton cmdSearchAndExtract
Caption = "查找并提取(&X)!"
Height = 495
Left = 2640
TabIndex = 3
Top = 840
Width = 2415
End
Begin VB.FileListBox fileSWF
Height = 1530
Left = 120
Pattern = "*.exe"
TabIndex = 2
Top = 2400
Width = 2295
End
Begin VB.DirListBox dirSWF
Height = 1770
Left = 120
TabIndex = 1
Top = 480
Width = 2295
End
Begin VB.DriveListBox drvSWF
Height = 300
Left = 120
TabIndex = 0
Top = 120
Width = 2295
End
Begin VB.Label Label3
Caption = "查找速度有点慢,如果你有更好的办法,请告知ubx@cmmail.com"
Height = 375
Left = 2520
TabIndex = 6
Top = 3480
Width = 2535
End
Begin VB.Label Label2
Caption = "正在查找地址,请耐心等待... *_*"
Height = 1695
Left = 2640
TabIndex = 5
Top = 1560
Visible = 0 'False
Width = 2415
WordWrap = -1 'True
End
Begin VB.Label Label1
Height = 375
Left = 2640
TabIndex = 4
Top = 240
Width = 2295
End
End
Attribute VB_Name = "Form3"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const lSWFFileHeader = 240000 '目前常见最低版本的flashpla结束位置


Private Sub cmdSearchAndExtract_Click()

Dim pt As Long
Dim pos As Long
Dim init As Long
Dim byteTmp() As Byte
Dim bHasFound As Boolean

bHasFound = False

If (fileSWF.FileName = "") Then
MsgBox "文件还没有选择", vbInformation
Exit Sub
End If

Open dirSWF.Path + "\" + fileSWF.FileName For Binary Access Read Lock Read As #1
Open dirSWF.Path + "\" + Mid(fileSWF.FileName, 1, Len(fileSWF.FileName) - 4) + ".swf" For Binary Access Write As #2

If LOF(1) > lSWFFileHeader Then 'flash 4.5版 player(flashpla.exe)长度在240,000以上
Label2.Visible = True
DoEvents

ReDim byteTmp(0 To LOF(1) - lSWFFileHeader) As Byte
Seek #1, lSWFFileHeader '直接跳到标志位置
Get #1, , byteTmp
init = 0
Do While init <= LOF(1) - lSWFFileHeader
If byteTmp(init) = CByte(Asc("F")) And init < LOF(1) - 3 Then
If byteTmp(init + 1) = CByte(Asc("W")) Then
If byteTmp(init + 2) = CByte(Asc("S")) Then
pos = init + lSWFFileHeader
bHasFound = True
Exit Do
End If
End If
End If
init = init + 1
Loop
Else
bHasFound = False
End If

If bHasFound = True Then
Label2.Caption = "发现地址(" + CStr(pos) + "),正在提取..."
DoEvents

ReDim byteTmp(0 To LOF(1) - pos) As Byte
Seek #1, pos
Get #1, , byteTmp
Put #2, , byteTmp

Label2.Caption = "资源提取到(" + Mid(fileSWF.FileName, 1, Len(fileSWF.FileName) - 4) + ".swf)。"
DoEvents

Else
Label2.Caption = "没有发现地址(这不是一个合法的SWF编译可执行文件)。"
End If

Close #1
Close #2

If bHasFound = True Then
If MsgBox("是否现在就观看刚提取的SWF文件?", vbYesNo + vbInformation) = vbYes Then
ShellExecute 0, "open", Mid(fileSWF.FileName, 1, Len(fileSWF.FileName) - 4) + ".swf", "", "", vbNormalFocus
End If
End If

End Sub

Private Sub dirSWF_Change()
fileSWF.Path = dirSWF.Path
End Sub

Private Sub drvSWF_Change()
dirSWF.Path = drvSWF.Drive
End Sub

Private Sub fileSWF_Click()
Label1 = fileSWF.FileName
End Sub
yaoweibin 2005-07-04
  • 打赏
  • 举报
回复
网上找的:
随着Macromedia Flash 5的闪亮推出,Flash在网络多媒体应用方面已经占据了不可动摇的地位,再加上中国闪客们的无私劳动,许多经典歌曲,比如“东北人”、“第一次” 等等都有了Flash版本的MTV,真是别有一番情趣。然而,网络上许多Flash作品都是EXE形式的,虽然方便了没有安装Flash插件的朋友,但是EXE形式的Flash不能用于网页制作,更不用说分析Action什么的了。由于手边没有免费的EXE2SWF工具,于是决定自己DIY一个,一显Programmer本色!

一、开发工具

我用到的开发工具有Delphi6,最好用的RAD工具; UltraEdit,强大的16进制编辑工具;ShowGood三国系列中的财神到.swf、桃源结义.swf、神啊救救我吧.exe、割须弃袍.exe;最后就是思考,最有力也是最根本的工具。^_^

二、基本思路

首先我设想了一个基本思路:EXE形式的Flash包含两部分,Flash播放器和跟在播放器后面的Swf文件,因为BMP2EXE、MP32EXE等软件都是这么做的。是不是这样呢?我们动手看一看吧!

用UltraEdit打开“财神到.swf”和“桃源结义.swf”分析文件头,非常明显,文件头都包括相同的ASCII码“FWS”,估计这是Flash文件的标识符。用UltraEdit打开“神啊救救我吧.exe”,文件全长1183046字节。按下Ctrl+F调出搜索对话框,在Find What后填入“FWS”并且勾上“Find ASCII”,搜索。果不其然,在5c000处找到了“FWS”,接着的部分也和“财神到.swf”中的非常相似,可见假设很有可能是正确的。顺藤摸瓜,查看两个.swf文件的文件尾,都是若干个00加上40 00 00 00的形式,然而“神啊救救我吧.exe”的文件尾却是若干个00加上40 00 00 00再加上120d3e处的56 34 12 FA 3E 4D 0C 00。最后这八个字节会是什么呢?再打开“割须弃袍.exe”,发觉它的最后八个字节是56 34 12 FA 82 F5 12 00。聪明的你一定猜到56 34 12 FA是EXE形式Flash文件的标识符了吧?经过检查其他EXE形式的Flash,事实证明了这个猜测是正确的。至于3E 4D 0C 00是什么呢?不妨把它当作一个32位整数,注意到低字节和高字节的逆序,3E 4D 0C 00就应该等于00 0C 4D 3E,也就是十进制的806206。OK!至此我们已经获取了足够多的信息,接着就看看有什么巧合吧!颠来倒去,不难发现,把“神啊救救我吧.exe”中swf部分的结束地址120d3e减去起始地址5c000,不就正好得到806206?
接下来要办的事情就简单了,我们动手证实一下。还是利用UltraEdit,把5c000至120d3e之间的数据粘贴出来,保存为一个.swf文件,用IE打开一看,这不就是久违了的陈小春的歌吗(如图1)?呵呵,大功告成!






顺便说一句,如果好奇的话,你还可以把0至5c000的数据直接保存成.exe文件看看,呵呵,惊奇吧,就是Flash 5中的Standalone Player!





三、编写程序

在正式编写程序之前,我想先花一些时间介绍Delphi 中的文件流操作。如果你已经对这个非常熟悉了,可以跳过去,直接阅读后文的代码。否则,请花一点时间看一看,这对于你阅读下面的代码非常有帮助。

在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法。那什么是流呢?简单来说,流就是建立在面向对象基础上的一种抽象的处理数据的工具。流中定义了一些处理数据的基本操作,如读取数据、写入数据等,程序员只是面对流进行所有操作的,不用关心流的另一头数据的真正流向。我们程序中将要使用TFileStream,它是TStream最常用的派生类。使用 TFileStream操作文件要比Object Pascal基本文件操作方便得多。TFileStream的基本操作是这样的:首先create一个实例,然后用try...finally TFileStream.free的格式操作,“...”部分可以用TFileStream的ReadBuffer、 Seek、

WriteBuffer、CopyFrom方法来操作文件流。此外,流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。编写程序时善加利用流,将会大大提高编程的效率。

好了,现在让我们正式开工。首先我们先设计窗体。打开Delphi,首先在窗体上添加两个Button、两个Edit、一个OpenDialog以及若干个Label工具,界面设计以及控件 Name属性都请参考图3,其他的采用默认值。




btnOpen是用来打开硬盘上EXE形式的Flash文件的,双击之,添加如下的代码:

procedure TForm1.btnOpenClick(Sender: TObject);

begin

// 通过OpenDialog让用户选择EXE形式的Flash

if OpenDialog.Execute then

begin

edtSourceExe.Text := OpenDialog.FileName;

// 自动生成.swf格式的文件名,方便用户

edtTargetSwf.Text := ChangeFileExt(edtSourceExe.Text, '.swf');

end;

end;

btnConvert是用来转换文件格式的按钮,双击之,添加如下代码:

procedure TForm1.btnConvertClick(Sender: TObject);

var

// 分别处理EXE、SWF文件的文件流

SourceStream, DestinyStream: TFileStream;

// SWF文件的大小

SwfFileSize: Cardinal;

begin

// 打开EXE形式的源文件

SourceStream := TFileStream.Create(edtSourceExe.Text, 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(edtTargetSwf.Text, fmCreate);

try

// 从EXE文件流中读取数据

DestinyStream.CopyFrom(SourceStream, SwfFileSize);

ShowMessage('File has been converted successfully!');

finally

// OK,释放文件流

DestinyStream.Free;

end;

end

else
ShowMessage('Unknown type of executable flash file!');

finally

// OK,释放文件流

SourceStream.Free;

end;

end;

程序比较简单,参考代码中的注释,相信程序很好理解。现在按下F9运行,打开一个EXE形式的Flash文件,按下Convert键,相应的SWF形式的Flash便生成了,我们的目的也就达到了。原理分析清楚了,再做一个SWF2EXE也是很简单的事情,只需要在文件头部依次追加Macromedia Flash 5中的Standalone Player、SWF文件、FA123456标志以及SWF文件长度即可。下面给出简单的示例代码,仅供参考:

function Swf2Exe(Source, Destiny, Linker: string): string;

var

// Source、Destiny、Linker分别是swf、exe和Standalone Player的文件名

SourceStream, DestinyStream, LinkStream: TFileStream;

flag: Cardinal;

SwfFileSize: integer;

begin

result := 'something error';

// 建立EXE文件

DestinyStream := TFileStream.Create(Destiny, fmCreate);

try

// 追加Standalone Player

LinkStream := TFileStream.Create(Linker, fmOpenRead or fmShareExclusive);

try

DestinyStream.CopyFrom(LinkStream, 0);

finally

LinkStream.Free;

end;

// 追加SWF文件

SourceStream := TFileStream.Create(Source, 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 := '';

finally

SourceStream.Free;

end;

finally

DestinyStream.Free;

end;

end;

至此,SWF与EXE互相转换的程序全部完成了。程序能够正确识别Flash4以及Flash5生成的EXE形式的Flash文件。不可否认,这个程序也不是万能的,网络中仍然存在一些非Macromedia官方的EXE形式的Flash文件。如果你掌握了文件分析的本领,那么这应该也不是什么难事吧?

程序在Delphi6、Windows98/2000下调试通过。

yaoweibin 2005-07-02
  • 打赏
  • 举报
回复
我需要做这样的软件哦,还要用Java编的,转化的软件http://www.masternewmedia.org/2004/04/14/powerpoint_to_flash_conversion_tools.htm
有20种
openoffice是源代码公开的,可惜是C语言的,决定去研究一下先
ll42002 2005-07-01
  • 打赏
  • 举报
回复
为什么要转化为swf,用pdf觉得容易一点。
laughsmile 2005-07-01
  • 打赏
  • 举报
回复
下载在:
http://www4.skycn.com/soft/17949.html
使用方法:
http://www.enet.com.cn/A20040921346061_1.html
全粘架构师 2005-07-01
  • 打赏
  • 举报
回复
你的意思是写个把.ppt转化为.swf的软件对吗
yaoweibin 2005-07-01
  • 打赏
  • 举报
回复
PDF没有多媒体效果

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧