2

私は今、Inno Setup がビデオ ファイルを使用するための拡張機能を探しています。たとえば、AVI や .png シーケンスなどをインストールのスプラッシュ スクリーンとして使用します (アルファ チャネルの使用は膨大な量になるでしょう)。プラスですが、必須ではありません)。フェードインとフェードアウトで静止画像を使用するための .dll がいくつかありますが、その目的でビデオ ファイルとして使用するものは見つかりませんでした。

私の知る限り、Inno Setup ではあらゆる種類の .dll を使用できます。たとえば、オーディオの再生に一般的な bass.dll を使用できますが、それは「本物の」Inno をサポートしていませんが、Inno はその .dll の関数を呼び出すことができます。

それで、これを可能にするプログラムはありますか?その方向のヒントは非常に役に立ちます。

編集: これは Qt で可能かもしれません。アプリケーション用にフレーム ベースのスプラッシュ スクリーンを正確に作成できることは知っていますが、Inno Setup で Qt を使用できるかどうかはわかりません。

4

1 に答える 1

4

Inno Media Playerビデオとオーディオの再生を InnoSetup ウィザードに埋め込むことができるプロジェクトを設立しました。これはテクノロジに基づいておりDirectShow、使用するには少なくとも DirectX 9 が必要です。

すべての DirectShow コーデックをサポートしていることを除いbuilt-in formatsて、ターゲット ユーザーがエキゾチックなメディア フォーマット用のコーデックを持っている必要はなく、それらのコーデックをインストールする必要がないことを考慮する必要があります。これは、インストールの開始時にショーが過剰であり、ユーザーにとって不公平になるためです。

あなたが望んでいた透明度については、それをサポートするコーデックが見つかった場合、ポップアップ ウィンドウを透明にして、DirectShow レンダラーがレイヤード ウィンドウに描画できるようにすることができますが、コーデックとサンプル ビデオがなければできません。なし。

  • ソース トランクにある、またはダウンロードできるサンプル スクリプトを含むライブラリfrom here
  • function reference関数パラメーターの説明を見つけることができる簡単な場所を書きました

したがって、ウィザード フォームが表示される前に、ビデオの再生とともにポップアップ ウィンドウを表示するには、以下を使用できます。

Inno Media Player は Unicode ライブラリであるため、ANSI バージョンではなく、Unicode バージョンの InnoSetup でのみ使用できることに注意してください。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 に答える