2

我现在正在寻找 Inno Setup 的扩展以使用视频文件,例如 AVI 或 .png 序列作为我安装的启动屏幕(使用 alpha 通道将是一个巨大的加上但不是必须的)。有几个 .dll 可以使用带有淡入和淡出的静态图片,但我找不到任何可以用作视频文件的东西。

据我所知,我可以在 Inno Setup 中使用任何类型的 .dll。例如,我可以使用流行的 bass.dll 进行音频播放,即使它没有“真正的”Inno 支持,但 Inno 可以调用该 .dll 的函数。

那么是否有任何程序可以让我这样做?朝那个方向的任何提示都会非常有帮助。

编辑:这可能使用 Qt,我知道您可以为您的应用程序制作基于框架的启动画面,但我不确定是否可以将 Qt 与 Inno Setup 一起使用?

4

1 回答 1

4

我已经创建了Inno Media Player能够将视频和音频播放嵌入到 InnoSetup 向导中的项目。它基于DirectShow技术,至少需要 DirectX 9 才能使用。

除了built-in formats它支持所有 DirectShow 编解码器,但您应该考虑到您的目标用户不需要为某些特殊媒体格式安装编解码器并安装它们的编解码器只是因为在安装启动时显示对用户来说是过度杀伤和不公平的。

关于您想要的透明度,如果您找到支持它的编解码器,我们可以尝试使弹出窗口透明并让 DirectShow 渲染器在分层窗口上绘制,但没有编解码器和示例视频我做不到没有。

  • 您可以在源主干中找到带有示例脚本的库或下载它from here
  • 我写了一个简单的function reference,你可以在其中找到函数参数说明

因此,要在显示向导表单之前显示带有视频播放的弹出窗口,您可以使用以下命令:

请注意,Inno Media Player 是一个 Unicode 库,因此您只能将其与 InnoSetup 的 Unicode 版本一起使用,而不能与 ANSI 版本一起使用!不支持 ANSI 版本的 InnoSetup...!

[Setup]
AppName=Media Player Project
AppVersion=1.0
DefaultDirName={pf}\Media Player Project

[Files]
Source: "MediaPlayer.dll"; Flags: dontcopy

[Code]
const
  EC_COMPLETE = $01;

type
  TDirectShowEventProc = procedure(EventCode, Param1, Param2: Integer);

function DSPlayMediaFile: Boolean;
  external 'DSPlayMediaFile@files:mediaplayer.dll stdcall';
function DSStopMediaPlay: Boolean;
  external 'DSStopMediaPlay@files:mediaplayer.dll stdcall';
function DSInitializeVideoFile(FileName: WideString; WindowHandle: HWND;
  var Width, Height: Integer; CallbackProc: TDirectShowEventProc): Boolean;
  external 'DSInitializeVideoFile@files:mediaplayer.dll stdcall';

var
  VideoForm: TSetupForm;  

procedure OnMediaPlayerEvent(EventCode, Param1, Param2: Integer); 
begin
  if EventCode = EC_COMPLETE then
    VideoForm.Close;  
end;

procedure OnVideoFormShow(Sender: TObject);
begin
  DSPlayMediaFile;
end;

procedure OnVideoFormClose(Sender: TObject; var Action: TCloseAction);
begin
  DSStopMediaPlay;
end;

procedure InitializeWizard;
var
  Width: Integer;
  Height: Integer;
begin
  VideoForm := CreateCustomForm;
  VideoForm.Caption := 'Popup Video Window';
  VideoForm.BorderStyle := bsNone;
  VideoForm.FormStyle := fsStayOnTop;
  VideoForm.Position := poScreenCenter;
  VideoForm.OnShow := @OnVideoFormShow;
  VideoForm.OnClose := @OnVideoFormClose; 

  if DSInitializeVideoFile('d:\Video.avi', VideoForm.Handle, Width, 
    Height, @OnMediaPlayerEvent)
  then
  begin
    VideoForm.ClientWidth := Width;
    VideoForm.ClientHeight := Height;     
    VideoForm.ShowModal;
  end;    
end;

procedure DeinitializeSetup;
begin
  DSStopMediaPlay;
end;

希望对您有所帮助!

于 2012-07-15T20:28:24.437 回答