用Delphi打造RM文件压缩机(原创) - 网络、编程相关 - 纵然情已逝

(这条文章已经被阅读了 96 次) 时间:2002-01-31 05:39:51 来源:纵然情已逝 (romantic) 原创-IT

用Delphi打造RM文件压缩机(原创)

摘要:随着RealPlayer的流行,RM格式的文件以其较高的压缩比、良好的音质效果和适于在互联网上传输等特点,受到广大电脑爱好者以及新闻和娱乐网站的喜爱。那么,你是否想自己动手制作RM文件呢?并且自己编程来实现呢?今天,我就和大家一起,用Delphi编程实现这个功能强大的“RM文件压缩机”。
关键字:RM文件、压缩机

一、 编程原理
RealProducer Plus是由 Real 公司所出的新一代的制作RM 格式(Real Audio/Video 音频、视频)文件制作工具,它可将 Wav、Mov、Avi、Au、Mpeg、MP3文件压制成 RM 影音文件( ra、rm、ram…),以利于网络的传送与播放或刻盘收藏。它的核心是由ProducerControl.ocx控件构成的。
Delphi6是功能强大的RAD开发工具,完全支持ActiveX,可以很方便地创建、注册、安装、发布和使用ActiveX控件、ActiveForm和OLE自动化对象。只要您的计算机中安装了RealProducer程序,软件会自动在您的计算机中注册ProducerControl.ocx控件。这样,我们可以在程序中直接导入这个控件来进行编程了,哈哈^_^,是不是很方便呀!
下面,我们利用这个控件编写一个功能强大的RM文件压缩程序。它不仅有压缩功能,而且可以试听,还可以得到关于压缩的相关信息等,是不是很酷呀:),程序的运行界面如图1和图2。(注:此处插入两个图片,插图在附件,文件名分别是picture1.jpg和picture2.jpg)

二、编程思想
下面,我想简单叙述一个编程思想,这对于初学者来说是必要的。
一、 如何实现进度条Gauge组件与ProducerControl控件的同步进行?
ProducerControl控件提供了一个非常重要的事件OnEncodingProgressChanged,它在压缩进行时触发,有一个非常重要的参数PercentDone,表示当前压缩完成的百分比,这样我们就可以轻松的实现这个功能了。

二、如何统计压缩所用的时间?
我们可以利用Timer控件来实现。压缩开始,我们设置Timer的Enabled属性为真,统计时间开始,当压缩完成时,设置Timer1.Enabled :=false,这样,就可以统计压缩所用时间了。为了实现对时间的控制,程序中用到三个变量hh、mm、ss,分别表示压缩所占的时、分、秒。

三、如何实现当压缩完成时,自动试听功能?
为了增强程序的功能,提供了自动试听功能,并且可以由用户自由选择。这可以在ProducerControl控件的OnEncodingStopped事件中实现,这个事件在压缩完成时触发,如果压缩完成,并且用户选择了自动试听,程序自动调用RealAudio控件播放。

三、窗体设计
启动Delphi6,新建一个工程,首先导入RealProducer控件和RealPlayer控件。然后,在窗体上放一个GroupBox组件,在其内分别放入两个Label组件,两个Edit组件和两个Button组件,并分别设置它们的Caption属性;然后放入一个Panel组件,其内分别放入刚才导入的ProducerControl、RealAudio控件,并初始化RealAudio控件为不可见,再放一个Panel组件,用来放有关压缩控件的提示,并分别设置它们的相关属性;三个GroupBox组件、四个Button组件、一个CheckBox组件、若干Label组件及Gauge组件等,分别设置其属性;根据程序的需要,再放入一个OpenDialog组件、一个SaveDialog组件和一个Timer组件。如图3所示。(注:此处插入图片,插图在附件,文件名是picture3.jpg)

四、编程实现
好了,现在让我们正式开工。
1、Button1是用来打开磁盘上的压缩源文件的,双击之,添加如下的代码:
//打开被压缩源文件
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Title :=’请选择要制作的媒体文件’;
if OpenDialog1.Execute then
begin
//Edit1控件保存了要进行压缩的源文件名信息
Edit1.Text :=OpenDialog1.FileName ;
Edit2.Text :=ChangeFileExt(OpenDialog1.FileName ,’.rm’);
//自动修改其扩展名为rm,方便用户
Button2.Enabled :=true; //启用另存为按钮
Button3.Enabled :=true; //启用开始解压按钮
end;
end;

2、Button2用来实现保存解压后的文件的,双击,输入下列代码:
//保存目标文件事件
procedure TForm1.Button2Click(Sender: TObject);
begin
SaveDialog1.Title :=’请输入要保存的文件’;
SaveDialog1.FileName := Edit1.Text ; //初始化另存为的默认文件名
if SaveDialog1.Execute then Edit2.Text :=ChangeFileExt(SaveDialog1.FileName,’.rm’);
//自动修改为默认的文件扩展名
end;

3、程序考虑到用户可能选择已经存在的文件,在一般的程序中,需要给用户一个选择是否覆盖的提示,在SaveDialog的OnCanClose事件中添加如下代码:
//该事件在选中文件时触发,用来提示用户是否覆盖已经存在的文件
procedure TForm1.SaveDialog1CanClose(Sender: TObject;
var CanClose: Boolean);
begin
if FileExists(SaveDialog1.FileName) then //如果文件已经存在
if MessageDlg(‘文件已经存在,保存吗?’, mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
Button2.Click ; //如果选择了覆盖,则退出,否则,重新让用户选择文件
end;

4、在设置了压缩控件的源/目标文件名后,就可以直接开始进行压缩了,但是还要进行一些压缩前的准备工作,这可以在ProducerControl控件的OnEncodingStarted事件中实现:
//当压缩开始时触发此事件,完成开始前的准备工作
procedure TForm1.ProducerControl1EncodingStarted(Sender: TObject);
begin
Gauge1.Progress :=0;
Button1.Enabled :=false;
Button2.Enabled :=false;
Button3.Enabled :=false;
Button4.Enabled :=true;
Edit1.Enabled :=false;
Edit2.Enabled :=false;
ProducerControl1.Visible :=true;
Panel2.Visible :=true; // ProducerControl可见
RealAudio1.Visible :=false; //RealAudio不可见
Label3.Caption :=’Encoding is Starting…’; // Label3.Caption用来表示当前的状态提示
hh:=0;
mm:=0;
ss:=0;
Timer1.Enabled :=true;
end;

5、Button3用来实现开始压缩的,代码如下:
//压缩开始
procedure TForm1.Button3Click(Sender: TObject);
begin
ProducerControl1.InputFilename :=”;
ProducerControl1.OutputFilename :=”;
ProducerControl1.InputFilename :=Edit1.Text ;
ProducerControl1.OutputFilename :=Edit2.Text ;
ProducerControl1.StartEncoding ;
end;

6、考虑到用户的输入可能造成压缩的出错,一般程序要求有错误检测能力,这可以在ProducerControl控件的OnErrorOccurred事件中实现,代码如下:
//当压缩出现错误时,触发此事件,显示错误提示信息procedure TForm1.ProducerControl1ErrorOccurred(Sender: TObject; ErrorCode: Integer; const ErrorString: WideString);
begin
MessageDlg(ErrorString,mtError, [mbOK], 0);
end;

7、Button4用来实现停止压缩功能的,代码如下:
//停止压缩
procedure TForm1.Button4Click(Sender: TObject);
begin
if ProducerControl1.IsEncoding then
ProducerControl1.StopEncoding ;
end;

8、为了实现程序的相互配合处理,还要对压缩停止或者压缩完成时做一些工作,这可以在ProducerControl控件的On EncodingStopped事件中实现,代码如下:
//当压缩停止或者结束时触发此事件
procedure Form1.ProducerControl1EncodingStopped(Sender: TObject);
begin
Button1.Enabled :=true;
Button2.Enabled :=true;
Edit1.Enabled :=true;
Edit2.Enabled :=true;
Button4.Enabled :=false;
Button5.Enabled :=true;
Timer1.Enabled :=false;
Label3.Caption :=’Encoding is stoped…’;
//如果用户选择了自动播放,则自动调用播放过程
if CheckBox1.Checked then
Button5.Click
else
Button3.Enabled :=true;
end;

9、Button5用来实现RM文件的试听功能的,代码如下:
//压缩完成时,可以利用此过程进行播放试听
procedure TForm1.Button5Click(Sender: TObject);
begin
//设置循环播放为假,即播放后直接退出
RealAudio1.SetLoop(false);
RealAudio1.Source :=Edit2.Text ;
RealAudio1.DoPlay ; //播放
Label3.Caption :=’RM files is playing…’;
Button5.Enabled :=false ;
Button3.Enabled :=false ;
RealAudio1.Visible :=true;
ProducerControl1.Visible :=false;
Panel2.Visible :=false;
end;

10、在试听结束后还要做一些工作,这可以在RealAudio控件的OnPlayStateChange事件中实现,代码如下:
//当播放完成时自动退出,完成恢复压缩控件显示等设置
procedure TForm1.RealAudio1PlayStateChange(Sender: TObject; lNewState: Integer);
begin
if lNewState=0 then // lNewState表示播放状态,其中0表示播放停止
begin
Button3.Enabled :=true;
Button5.Enabled :=true;
ProducerControl1.Visible :=true;
Panel2.Visible :=true;
RealAudio1.Visible :=false;
Label3.Caption :=’Encoding is prepairing…’;
end;
end;

12、压缩时间的统计,可以在Timer控件的OnTimer事件中实现,双击添加如下代码:
//计算压缩所用时间
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ss:=ss+1;
if ss>59 then
begin
ss:=0;
mm:=mm+1;
end
else
if mm>59 then
begin
mm:=0;
hh:=hh+1;
end
else
if hh>23 then
hh:=0;
Label5.Caption :=Format(‘%d:%d:%d’,[hh,mm,ss]); //显示格式化后的时间
end;

13、Button6按钮用来实现退出功能的,代码如下:
//释放变量所占空间,退出程序
procedure TForm1.Button6Click(Sender: TObject);
begin
//如果用户选择退出时正在解压,则先停止解压
if ProducerControl1.IsEncoding then
ProducerControl1.StopEncoding ;
ProducerControl1.FreeOnRelease ;
ProducerControl1.Destroy ;
RealAudio1.FreeOnRelease ;
RealAudio1.Destroy ;
Close;
end;

14、最后不要忘记对程序做一些初始化工作的,这可以在Form的OnCreate事件中实现,代码如下:
//窗体初始化
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Enabled :=false; //初始化“另存为”按钮不可用
Button3.Enabled :=false; //初始化“开始”按钮不可用
Button4.Enabled :=false; //初始化“停止”按钮不可用
Button5.Enabled :=false; //初始化“播放”按钮不可用
Timer1.Enabled :=false; //初始化时间控件不可用
//Edit1.Text存放要解压的源文件
Edit1.Text :=’Enter your source filename here.’;
//Edit2.Text存放解压后的目标文件
Edit2.Text :=’Enter your target filename here.’;
Gauge1.MinValue :=0;
Gauge1.MaxValue :=99; //初始化进度条的最大和最小值
ProducerControl1.InputType :=INPUT_SOURCE_FILE; //初始化对文件进行压缩
ProducerControl1.TempDirectory :=’D:\WINNT\Temp’; //设置该控件的暂存目录
ProducerControl1.Target256KDSLCableModem :=true; //目标听众为256kDSL线缆
ProducerControl1.InputDoAudio :=true; //音频输入为真
ProducerControl1.InputDoVideo :=true; //视频输入为真
ProducerControl1.AudioContent :=AUDIO_CONTENT_VOICE_BACKGROUND; //包括声音和背景音乐
ProducerControl1.VideoQuality:=VIDEO_QUALITY_SMOOTH_MOTION; //图象平滑
ProducerControl1.Author :=’耿百强’; //初始化解压后RM文件的作者
ProducerControl1.Title :=’RM文件压缩机示例’; //初始化标题
ProducerControl1.Copyright :=’版权所有,耿百强’; //初始化版权信息
ProducerControl1.Description :=’这是一个RM文件压缩机示例!软件制作,耿百强’; //初始化描述信息
ProducerControl1.Keywords :=’控件,压缩,音乐’; //初始化关键字
end;

五、完善程序
以上我们较为全面地实现了RM文件的压缩及试听功能。当然,我们还可以对程序进行功能增强,比如增加用户选择压缩方式、设定目标听众、批量压缩处理,甚至可以自己实现一个压缩精灵,目标就是功能增强、易用性提高、方便用户。限于篇幅关系,我就不介绍了。大家如果有问题,请发邮件到[email protected]
程序在Delphi6、Windows2000/XP下调试通过。