GDI+ Intro Video für Programme/Spiele

  • Ich habe mal ein Beispiel geschrieben um mit GDI+ z.B. ein Intro Video das über die Möglichkeiten von GDI+ hinausgeht oder zu langsam zu zeichnen wäre für irgendein Programm abzuspielen.

    Es gibt auch bestimmt andere Methoden um ein Video in einem AutoIt Fenster abzuspielen. Allerdings wollte ich es mit GDI+ aus 2 Gründen machen.
    - Man kann mit dieser Methode auch eine Bilder Sequenz an einer bestimmten Position in einer bestimmten Größe auf einem bestimmten Hintergrund abspielen.
    - Da das ganze mit GDI+ Funktioniert ist es perfekt für GDI+ basierte Scripts (z.B. Spiele).

    Das besondere an meinem Beispiel ist, dass die Bilder mit einer exakten Framerate abgespielt werden und somit synchron zur Audiospur sind die möglicherweise im Hintergrund läuft. Die Methode mit AdlibRegister und 1000 / FPS die ich mal vorgeschlagen habe ist viel zu ungenau und die Video Sequenz teilweise 2 Sekunden zu früh fertig.

    Mein Beispiel habe ich übrigens mit Adobe After Effects gemacht :P, es kann aber auch einfach eine Sequenz mit Bildern aus z.B. GIMP oder sogar MS Paint erstellt werden ;).

    Beispiel
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <File.au3>
    #include <Sound.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $iGUIWidth = 600
    $iGUIHeight = 400

    [/autoit] [autoit][/autoit] [autoit]

    $FPS = 40

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICreate("Name22 Logo", $iGUIWidth, $iGUIHeight)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $aLogo_Name22[1]
    $aLogo_Name22[0] = 0
    $iCurrentFrame = 1

    [/autoit] [autoit][/autoit] [autoit]

    $aSoundBG = _SoundOpen(@ScriptDir & "\Sounds\Logo_Name22 Soundtrack.mp3")
    _LoadData()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    _SoundPlay($aSoundBG)
    AdlibRegister("_DrawFrame", 20)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawFrame()
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $aLogo_Name22[$iCurrentFrame], 0, 0, $iGUIWidth, $iGUIHeight)
    $iCurrentFrame = Floor(TimerDiff($iTimer) / 1000 * $FPS)
    If $iCurrentFrame >= $aLogo_Name22[0] Then
    _Exit()
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _LoadData()
    $aFilesTmp = _FileListToArray(@ScriptDir & "\Images\Logo_Name22", "*.png", 1)
    If IsArray($aFilesTmp) Then
    ReDim $aLogo_Name22[$aFilesTmp[0] + 1]
    $aLogo_Name22[0] = $aFilesTmp[0]
    For $i = 1 To $aLogo_Name22[0]
    $aLogo_Name22[$i] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Logo_Name22\" & $aFilesTmp[$i])
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    For $i = 1 To $aLogo_Name22[0]
    _GDIPlus_ImageDispose($aLogo_Name22[$i])
    Next
    _GDIPlus_Shutdown()
    _SoundClose($aSoundBG)
    Exit
    EndFunc

    [/autoit]


    Die benötigten Dateien und das Script findet ihr hier oder hier...
    Falls euch der Download zu groß ist, dann könnt ihr auch einfach ein paar eurer Bilder nehmen (ihr müsst im Grunde nur die Pfade anpassen).
    Ich würde mich über konstruktive Kritik zum Script freuen ;). Eure Meinungen über meine After Effects Skills u.Ä. bitte für euch behalten :D.

  • Sieht beeindruckend aus!
    Allerdings ist 23MB doch etwas groß...
    Du könntest das Video als "richtige" Videodatei beilegen (z.B.: DivX kodiert) und bei Scriptstart die einzelnen Bilder mit ffmpeg extrahieren.
    das würde weniger Speicher benötigen.

    Das wär zumindest einen Versuch wert ;)

    E

  • Zitat

    Du könntest das Video als "richtige" Videodatei beilegen (z.B.: DivX kodiert) und bei Scriptstart die einzelnen Bilder mit ffmpeg extrahieren.


    Oh. Ich wusste gar nicht, dass das mit ffmpeg.exe geht ^^. Klar dann ist es noch besser, aber die andere Möglichkeit ist auch zu gebrauchen denke ich, hoffe ich... Ach egal ich versuch es mal mit der ffmpeg.exe. :S