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。 |
|
? |
下面,我想简单叙述一个编程思想,这对于初学者来说是必要的。 |
一、 如何实现进度条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所示。 |
1、Button1是用来打开磁盘上的压缩源文件的,双击之,添加如下的代码: |
procedure TForm1.Button1Click(Sender: TObject); |
OpenDialog1.Title :='请选择要制作的媒体文件'; |
if OpenDialog1.Execute then |
Edit1.Text :=OpenDialog1.FileName ; |
Edit2.Text :=ChangeFileExt(OpenDialog1.FileName ,'.rm'); |
Button2.Enabled :=true; //启用另存为按钮 |
Button3.Enabled :=true; //启用开始解压按钮 |
2、Button2用来实现保存解压后的文件的,双击,输入下列代码: |
procedure TForm1.Button2Click(Sender: TObject); |
SaveDialog1.Title :='请输入要保存的文件'; |
SaveDialog1.FileName := Edit1.Text ; //初始化另存为的默认文件名 |
if SaveDialog1.Execute then Edit2.Text :=ChangeFileExt(SaveDialog1.FileName,'.rm'); |
3、程序考虑到用户可能选择已经存在的文件,在一般的程序中,需要给用户一个选择是否覆盖的提示,在SaveDialog的OnCanClose事件中添加如下代码: |
//该事件在选中文件时触发,用来提示用户是否覆盖已经存在的文件 |
procedure TForm1.SaveDialog1CanClose(Sender: TObject; |
if FileExists(SaveDialog1.FileName) then //如果文件已经存在 |
if MessageDlg('文件已经存在,保存吗?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then |
Button2.Click ; //如果选择了覆盖,则退出,否则,重新让用户选择文件 |
4、在设置了压缩控件的源/目标文件名后,就可以直接开始进行压缩了,但是还要进行一些压缩前的准备工作,这可以在ProducerControl控件的OnEncodingStarted事件中实现: |
procedure TForm1.ProducerControl1EncodingStarted(Sender: TObject); |
ProducerControl1.Visible :=true; |
Panel2.Visible :=true; // ProducerControl可见 |
RealAudio1.Visible :=false; //RealAudio不可见 |
Label3.Caption :='Encoding is Starting...'; // Label3.Caption用来表示当前的状态提示 |
procedure TForm1.Button3Click(Sender: TObject); |
ProducerControl1.InputFilename :=''; |
ProducerControl1.OutputFilename :=''; |
ProducerControl1.InputFilename :=Edit1.Text ; |
ProducerControl1.OutputFilename :=Edit2.Text ; |
ProducerControl1.StartEncoding ; |
6、考虑到用户的输入可能造成压缩的出错,一般程序要求有错误检测能力,这可以在ProducerControl控件的OnErrorOccurred事件中实现,代码如下: |
//当压缩出现错误时,触发此事件,显示错误提示信息procedure TForm1.ProducerControl1ErrorOccurred(Sender: TObject; ErrorCode: Integer; const ErrorString: WideString); |
MessageDlg(ErrorString,mtError, [mbOK], 0); |
7、Button4用来实现停止压缩功能的,代码如下: |
procedure TForm1.Button4Click(Sender: TObject); |
if ProducerControl1.IsEncoding then |
ProducerControl1.StopEncoding ; |
8、为了实现程序的相互配合处理,还要对压缩停止或者压缩完成时做一些工作,这可以在ProducerControl控件的On EncodingStopped事件中实现,代码如下: |
procedure Form1.ProducerControl1EncodingStopped(Sender: TObject); |
Label3.Caption :='Encoding is stoped...'; |
if CheckBox1.Checked then |
9、Button5用来实现RM文件的试听功能的,代码如下: |
procedure TForm1.Button5Click(Sender: TObject); |
RealAudio1.SetLoop(false); |
RealAudio1.Source :=Edit2.Text ; |
Label3.Caption :='RM files is playing...'; |
Button5.Enabled :=false ; |
Button3.Enabled :=false ; |
RealAudio1.Visible :=true; |
ProducerControl1.Visible :=false; |
10、在试听结束后还要做一些工作,这可以在RealAudio控件的OnPlayStateChange事件中实现,代码如下: |
//当播放完成时自动退出,完成恢复压缩控件显示等设置 |
procedure TForm1.RealAudio1PlayStateChange(Sender: TObject; lNewState: Integer); |
if lNewState=0 then // lNewState表示播放状态,其中0表示播放停止 |
ProducerControl1.Visible :=true; |
RealAudio1.Visible :=false; |
Label3.Caption :='Encoding is prepairing...'; |
12、压缩时间的统计,可以在Timer控件的OnTimer事件中实现,双击添加如下代码: |
procedure TForm1.Timer1Timer(Sender: TObject); |
Label5.Caption :=Format('%d:%d:%d',[hh,mm,ss]); //显示格式化后的时间 |
13、Button6按钮用来实现退出功能的,代码如下: |
procedure TForm1.Button6Click(Sender: TObject); |
if ProducerControl1.IsEncoding then |
ProducerControl1.StopEncoding ; |
ProducerControl1.FreeOnRelease ; |
ProducerControl1.Destroy ; |
RealAudio1.FreeOnRelease ; |
14、最后不要忘记对程序做一些初始化工作的,这可以在Form的OnCreate事件中实现,代码如下: |
procedure TForm1.FormCreate(Sender: TObject); |
Button2.Enabled :=false; //初始化“另存为”按钮不可用 |
Button3.Enabled :=false; //初始化“开始”按钮不可用 |
Button4.Enabled :=false; //初始化“停止”按钮不可用 |
Button5.Enabled :=false; //初始化“播放”按钮不可用 |
Timer1.Enabled :=false; //初始化时间控件不可用 |
Edit1.Text :='Enter your source filename here.'; |
Edit2.Text :='Enter your target filename here.'; |
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 :='控件,压缩,音乐'; //初始化关键字 |
以上我们较为全面地实现了RM文件的压缩及试听功能。当然,我们还可以对程序进行功能增强,比如增加用户选择压缩方式、设定目标听众、批量压缩处理,甚至可以自己实现一个压缩精灵,目标就是功能增强、易用性提高、方便用户。限于篇幅关系,我就不介绍了。大家如果有问题,请发邮件到dxgbq@sohu.com。 |
程序在Delphi6.0、Windows2000/XP下调试通过。 |
阅读(1010) | 评论(0) | 转发(0) |