Programm schreiben zum aufnehmen von videos??

  • wie ihr in der überschrift lesen könnt wollte ich fragen ob es möglich ist mit autoit ein programm zu schreiben das videos vom desktop aufnimmt??


    wenn ja wie lautet der befehl?

    Einmal editiert, zuletzt von crocojunk (16. Juli 2010 um 18:45)

  • Zitat

    wenn ja wie lautet der befehl?


    Glaubst du es gibt einen fertigen Befehl der dir ein Video vom Desktop aufnimmt? :D
    Das hier kann eine avi Datei aus Bitmaps zusammenbasteln.
    Du musst also nur noch ScreenShots in regelmäßigen Abständen machen und diese dann in eine avi packen.

  • Sorry,
    aber wenn du da net durchblickst ( ist ziemlich einfach ), dann lass es am besten und lade dir ein anderes Programm, was das schon kann, runter ;)

  • oh entschuldigung wenn ich eine frage gestellt habe wo ich mir sicher sein wollte ob es auch stimmt.

  • Zitat

    würde das video nicht ruckeln also zuwenig fps haben?

    mit angenommenen 25 fps (Videoformat) kannst du dir ausrechnen wie lange ein Schreibzyklus eines Screencaptures() dauern darf. 1000ms/25=40ms
    Da sich auf dem Desktop idR ausser Mauszeigern und ggf einigen Buchstaben nicht viel bewegt, ist enormes Einsparpotential vorhanden. Es muss nur z.B. jeder 10. Frame als Vollbild gespeichert werden, bei den dazwischenliegenden Frames werden nur die Änderungen im Bild gespeichert/abgespielt.
    Ein simpler "Video-Recorder/Abspieler". Wäre mal eine schöne Aufgabe für ein µIt!

  • Ja, denn eigendlich braucht man keine 25 Screenshots auf der Platte bzw bei der Übertragung. Wenn man den Devicecontext des Desktops per bitblt (und dem passenden $iRop) Parameter mit dem vorherigen "Frame" vergleicht, ergibt sich ein "Differenzbild". Überall dort, wo KEINE Änderung vorkommt, bleibt deas Bild schwarz. Gewissermassen werden nur die veränderten Bildteile markiert. Da ein Bitblt in Hardware ausgeführt wird, dauert es nur einige Millisekunden. Die "Kompression" ist eigentlich easy, da die schwarzen "Pixel" einfach nur gezählt werden müssen. Also etwa so: (Schwarz 18344 mal), (Pixelfarbe), (Pixelfarbe), (Pixelfarbe), (Schwarz 312 mal), (Pixelfarbe)....
    Mal angenommen, der Mauszeiger ist 30x40 Pixel groß und ändert die Position, dann würden auf einem 1680x1050 Pixel grossen Bildschirm nur die 30x40 Pixel plus ca. 400Bytes für die "schwarzen" Pixel übertragen werden. Insgesamt also knapp 5kb Daten. Diese "Mini(de)kompression" könnte man aus Geschwindigkeitsgründen als dll ausführen, einmal als 32-Bit, einmal als 64-Bit-dll.
    Andererseits wäre die Frage, was bei einer JPG-Kompression an Dateigröße herauskommen würde, dann könnte man alles komplett in AutoIt machen...

  • also mein ziel ist es ein programm schreiebn zum aufnehmen von videos.

    nur mit den Fullscreen bekomme ich das nicht hin.

  • ich hab ein problem immer wenn ich auf play drücke kommt ein error aber nicht vom script

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <AVIWriter.au3>
    #include <File.au3>
    #include <ScreenCapture.au3>
    #include <SliderConstants.au3>
    #include <GUIListBox.au3>

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

    HotKeySet ("^v")
    HotKeySet ("{ESC}","close")
    HotKeySet ("^p")
    _StartAviLibrary()
    $avi = _CreateAvi("C:\Crocoframe\Videos\" & "\crocoframe.avi", 5,200,200)
    Break (0)

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

    DirCreate ("C:\Crocoframe\")
    DirCreate ("C:\Crocoframe\Videos\")
    DirCreate ("C:\Crocoframe\Bilder\")
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("CrocoFrame © CrocoJunk ", 548, 250, 192, 124)
    $Pic1 = GUICtrlCreatePic("", 0, 0, 545, 89, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Label1 = GUICtrlCreateLabel("Video aufnehmen", 8, 112, 87, 17)
    $Button1 = GUICtrlCreateButton("Play (STRG+V) ", 120, 112, 100, 25, $WS_GROUP)
    $Label2 = GUICtrlCreateLabel("Video Pausieren", 8, 152, 81, 17)
    $Button2 = GUICtrlCreateButton("Pause (P)", 120, 152, 75, 25, $WS_GROUP)
    $Label3 = GUICtrlCreateLabel("Video stoppen", 8, 192, 72, 17)
    $Button3 = GUICtrlCreateButton("Video Beenden (ESC)", 120, 200, 120, 25, $WS_GROUP)
    $Checkbox1 = GUICtrlCreateCheckbox("Video starten nachdem aufgenommen", 256, 120, 193, 17)
    $Checkbox2 = GUICtrlCreateCheckbox("Video starten nach", 256, 168, 113, 17)
    $menu1 = GUICtrlCreateMenu ("Datei")
    $item1 = GUICtrlCreateMenuItem ("Optionen", $menu1)
    $item2 = GUICtrlCreateMenuItem ("Easy Screen", $menu1)
    GUICtrlCreateInput("", 376, 168, 57, 21)
    $Label4 = GUICtrlCreateLabel("Sekunden", 448, 168, 53, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    if not @error Then
    MsgBox (64, "Video", "Das Video startet jetz!")
    EndIf
    _StartAviLibrary()
    $avi = _CreateAvi("C:\Crocoframe\Videos\" & "\crocoframe.avi", 5,200,200)
    Do
    $m = MouseGetPos()
    $hBmp = _ScreenCapture_Capture("", $m[0] - 100, $m[1] - 100, $m[0] + 100, $m[1] + 100, True)
    _AddHBitmapToAvi($avi, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    Sleep(200)
    Until False

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

    Case $Button2
    Case $Button3
    close()
    Case $Checkbox1
    Case $Checkbox2
    case $item1
    _optionen()
    case $item2
    _screen()

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

    EndSwitch
    WEnd

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

    Func _optionen()

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

    EndFunc
    Func _screen()
    EndFunc

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

    Func close()
    _CloseAvi($avi)
    _StopAviLibrary()
    EndFunc

    [/autoit]


    ihr braucht auch noch die #include (wer sie nicht hat)

  • Hallo crocojunk,

    durch das Include-File scheinen die normalen Messages für GuiGetMsg nicht mehr zu funktionieren. Hier einmal das Skript zu Testzwecken mit AdLibRegister so abgeändert, dass 10 Sekunden aufgenommen werden:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <AVIWriter.au3>
    #include <File.au3>
    #include <ScreenCapture.au3>
    #include <SliderConstants.au3>
    #include <GUIListBox.au3>

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

    Global $Capture

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

    HotKeySet("^v")
    HotKeySet("{ESC}", "close")
    HotKeySet("^p")
    ;_StartAviLibrary()
    ;$avi = _CreateAvi("C:\Crocoframe\Videos\" & "\crocoframe.avi", 5,200,200)
    ;Break (0)

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

    DirCreate("C:\Crocoframe\")
    DirCreate("C:\Crocoframe\Videos\")
    DirCreate("C:\Crocoframe\Bilder\")
    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("CrocoFrame © CrocoJunk ", 548, 250, 192, 124)
    $Pic1 = GUICtrlCreatePic("", 0, 0, 545, 89, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    $Label1 = GUICtrlCreateLabel("Video aufnehmen", 8, 112, 87, 17)
    $Button1 = GUICtrlCreateButton("Play (STRG+V) ", 120, 112, 100, 25, $WS_GROUP)
    $Label2 = GUICtrlCreateLabel("Video Pausieren", 8, 152, 81, 17)
    $Button2 = GUICtrlCreateButton("Pause (P)", 120, 152, 75, 25, $WS_GROUP)
    $Label3 = GUICtrlCreateLabel("Video stoppen", 8, 192, 72, 17)
    $Button3 = GUICtrlCreateButton("Video Beenden (ESC)", 120, 200, 120, 25, $WS_GROUP)
    $Checkbox1 = GUICtrlCreateCheckbox("Video starten nachdem aufgenommen", 256, 120, 193, 17)
    $Checkbox2 = GUICtrlCreateCheckbox("Video starten nach", 256, 168, 113, 17)
    $menu1 = GUICtrlCreateMenu("Datei")
    $item1 = GUICtrlCreateMenuItem("Optionen", $menu1)
    $item2 = GUICtrlCreateMenuItem("Easy Screen", $menu1)
    GUICtrlCreateInput("", 376, 168, 57, 21)
    $Label4 = GUICtrlCreateLabel("Sekunden", 448, 168, 53, 17)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    If Not @error Then
    MsgBox(64, "Video", "Das Video startet jetz!")
    EndIf
    $Capture = True
    _StartAviLibrary()
    $avi = _CreateAvi("C:\Crocoframe\Videos\" & "\crocoframe.avi", 5, 200, 200)
    AdlibRegister("close",10000) ;vorsichtshalber Buttons funktionieren nicht Hotkey ESC klappt aber
    ConsoleWrite("STARTED" & @CRLF)
    While $Capture
    $m = MouseGetPos()
    $hBmp = _ScreenCapture_Capture("", $m[0] - 100, $m[1] - 100, $m[0] + 100, $m[1] + 100, True)
    _AddHBitmapToAvi($avi, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    Sleep(200)
    WEnd
    ConsoleWrite("STOPPED" & @CRLF)
    AdlibUnRegister("close")

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

    Case $Button2
    Case $Button3
    ConsoleWrite("STOP" & @CRLF)
    close()
    Case $Checkbox1
    Case $Checkbox2
    Case $item1
    _optionen()
    Case $item2
    _screen()

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

    EndSwitch
    WEnd

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

    Func _optionen()

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

    EndFunc ;==>_optionen
    Func _screen()
    EndFunc ;==>_screen

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

    Func close()
    _CloseAvi($avi)
    _StopAviLibrary()
    $Capture = False
    EndFunc ;==>close

    [/autoit]


    hier gibt es ein funktionierendes Skript AviCapture

  • das er die namen automatisch ändert dazu brauch ich eine ini datei oder?

    ich hatte die idee mit iniwrite das zu machen.

    doch irgendwie funktioniert das nicht

    ich hab das so

    [autoit]


    IniWrite ("confic.ini", "C:\Crocoframe\" , "AVINAME", "crocoframe2")

    [/autoit]

    und in der ini steht das

    [AVINAME]
    crocoframe1