VideoFortschrittsbalken

  • Hey Leute

    ich programmier grade einen Videoplayer und habe jetzt ein Problem:

    wenn ich ein Video gestartet habe, dann kommt ein Slider als Fortschrittsbalken und dieser wird immer auf die aktuelle position im Video gesetzt, wenn ich aber jetzt auf eine Stelle auf den Slider klicke, dann wird das Video zwar auf die gewünschte Position gesetzt, aber es hackelt ein bisschen, das müsst ihr am besten sehen ;)

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <WMP.au3>
    OnAutoItExitRegister("_EXIT")
    Global $wmp
    Global $slider
    Global $videogui
    Global $videopfad = @UserProfileDir&"\Videos\"
    Global $videos = _FileListToArrayEx($videopfad,"*.avi;*.wmv",1)
    Global $Videosize = UBound($videos)
    Dim $groessevideos[$Videosize]
    Dim $Videolistitem[$Videosize]
    $DLL=DllOpen("MediaInfo.dll")
    $Handle=DllCall($DLL, "ptr", "MediaInfo_New")
    If IsArray($videos) = 0 Then
    MsgBox(0,"ERROR","In dem ausgewählten Verzeichnis befinden sich keine Video Dateien")
    $pfad = FileSelectFolder("Video Dateien angeben","C:")
    $videos = _FileListToArrayEx($videopfad,"*.avi;*.wmv",1)
    EndIf
    $Taschenrechner = GUICreate("Media Player",500,530,-1,-1,$WS_POPUP)
    GUISetBkColor(0x000000)
    $verschiebungscontrol=GUICtrlCreateLabel("",220,0,220,40,"",$GUI_WS_EX_PARENTDRAG)
    $bClose = GUICtrlCreateButton("X",470,10,20,20)
    $bMinimize = GUICtrlCreateButton("_",440,10,20,20)
    $bMusic = GUICtrlCreateButton("Musicplayer",10,10,100,20)
    $bRadio = GUICtrlCreateButton("Radio",120,10,100,20)
    $bPfad = GUICtrlCreateButton("Video Ordner Auswählen",10,40,480,40)
    $VideoList = GUICtrlCreateListView("VideoName |Größe",10,90,480,430)
    GUISetState()
    _getgroesse()
    _listefuellen()
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $bClose
    Exit
    Case $bMinimize
    GUISetState(@SW_MINIMIZE)
    Case $bPfad
    _videopfadaendern()
    EndSwitch
    For $j=1 To $Videosize-1
    Switch $msg
    Case $Videolistitem[$j]
    _Filmspielen($j)
    EndSwitch
    Next
    WEnd

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

    Func _Filmspielen($Nummer)
    $Open_Result=DllCall($DLL, "int", "MediaInfo_Open", "ptr", $Handle[0], "wstr", $videopfad&$videos[$Nummer])
    DllCall($DLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Inform", "wstr", "Video;%Width%")
    $Inform=DllCall($DLL, "wstr", "MediaInfo_Inform", "ptr", $Handle[0], "int", 0)
    $breite = $Inform[0]
    DllCall($DLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Inform", "wstr", "Video;%Height%")
    $Inform=DllCall($DLL, "wstr", "MediaInfo_Inform", "ptr", $Handle[0], "int", 0)
    $hoehe= $Inform[0]
    GUISetState(@SW_HIDE,$Taschenrechner)
    $videogui = GUICreate($videos[$Nummer],$breite,$hoehe+100)
    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "quit")
    $wmp = _wmpcreate(1, 0, 0, $breite, $hoehe)
    _wmploadmedia($wmp,$videopfad&$videos[$Nummer])
    $slider = GUICtrlCreateSlider(10,$hoehe+10,$breite-20,20)
    GUICtrlSetOnEvent($slider,"setzePosition")
    While _wmpvalue($wmp,"getduration") = 0
    Sleep(1)
    WEnd
    GUICtrlSetLimit($slider,_wmpvalue($wmp,"getduration"),0)
    GUISetState(@SW_SHOW,$videogui)
    AdlibRegister("setzeBalken",100)
    _wmpvalue( $wmp, "controls" )
    EndFunc
    Func setzeBalken()
    GUICtrlSetData( $slider, _wmpvalue($wmp,"getposition"))
    EndFunc
    Func setzePosition()
    _wmpvalue($wmp,"setposition",GUICtrlRead($slider))
    EndFunc
    Func quit()
    AdlibUnRegister("setzeBalken")
    GUIDelete($videogui)
    GUISetState(@SW_SHOW,$Taschenrechner)
    Opt("GUIOnEventMode", 0)
    EndFunc
    Func _listefuellen()
    For $i=1 To $Videosize-1
    $Videolistitem[$i] = GUICtrlCreateListViewItem($videos[$i]&"|"&$groessevideos[$i],$VideoList)
    Next
    EndFunc
    Func _getgroesse()
    For $i=1 To $Videosize-1
    $groessevideos[$i] = FileGetSize($videopfad&$videos[$i])/1000000
    $groessevideos[$i] = Round($groessevideos[$i],2)
    $groessevideos[$i] = $groessevideos[$i]&"MB"
    Next
    EndFunc
    Func _videopfadaendern()
    _GUICtrlListView_DeleteAllItems($VideoList)
    $pfadzwischen = FileSelectFolder("Musikordner auswählen","")
    $pfad = $pfadzwischen&"\"
    $videos = _FileListToArrayEx($videopfad,"*.avi;*.wmv",1)
    $Videosize = UBound($videos)
    _listefuellen()
    EndFunc
    Func _EXIT()
    $Handle=DllCall($DLL, "none", "MediaInfo_Delete", "ptr", $Handle[0])
    DllClose($dll)
    EndFunc

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

    Func _FileListToArrayEx($sPath, $sFilter = '*.*', $iFlag = 0, $sExclude = '')
    If Not FileExists($sPath) Then Return SetError(1, 1, '')
    If $sFilter = -1 Or $sFilter = Default Then $sFilter = '*.*'
    If $iFlag = -1 Or $iFlag = Default Then $iFlag = 0
    If $sExclude = -1 Or $sExclude = Default Then $sExclude = ''
    Local $aBadChar[6] = ['\', '/', ':', '>', '<', '|']
    For $iCC = 0 To 5
    If StringInStr($sFilter, $aBadChar[$iCC]) Or _
    StringInStr($sExclude, $aBadChar[$iCC]) Then Return SetError(2, 2, '')
    Next
    If StringStripWS($sFilter, 8) = '' Then Return SetError(2, 2, '')
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, '')
    Local $oFSO = ObjCreate("Scripting.FileSystemObject"), $sTFolder
    $sTFolder = $oFSO.GetSpecialFolder(2)
    Local $hOutFile = @TempDir & $oFSO.GetTempName
    If Not StringInStr($sFilter, ';') Then $sFilter &= ';'
    Local $aSplit = StringSplit(StringStripWS($sFilter, 8), ';'), $sRead
    For $iCC = 1 To $aSplit[0]
    If StringStripWS($aSplit[$iCC], 8) = '' Then ContinueLoop
    If StringLeft($aSplit[$iCC], 1) = '.' And _
    UBound(StringSplit($aSplit[$iCC], '.')) - 2 = 1 Then $aSplit[$iCC] = '*' & $aSplit[$iCC]
    RunWait(@ComSpec & ' /c ' & 'dir "' & $sPath & '\' & $aSplit[$iCC] _
    & '" /b /o-e /od > "' & $hOutFile & '"', '', @SW_HIDE)
    $sRead &= FileRead($hOutFile)
    If Not FileExists($hOutFile) Then Return SetError(4, 4, '')
    FileDelete($hOutFile)
    Next
    If StringStripWS($sRead, 8) = '' Then SetError(4, 4, '')
    Local $aFSplit = StringSplit(StringTrimRight(StringStripCR($sRead), 1), @LF)
    Local $sHold
    For $iCC = 1 To $aFSplit[0]
    If $sExclude And StringLeft($aFSplit[$iCC], _
    StringLen(StringReplace($sExclude, '*', ''))) = StringReplace($sExclude, '*', '') Then ContinueLoop
    Switch $iFlag
    Case 0
    $sHold &= $aFSplit[$iCC] & Chr(1)
    Case 1
    If StringInStr(FileGetAttrib($sPath & '\' & $aFSplit[$iCC]), 'd') Then ContinueLoop
    $sHold &= $aFSplit[$iCC] & Chr(1)
    Case 2
    If Not StringInStr(FileGetAttrib($sPath & '\' & $aFSplit[$iCC]), 'd') Then ContinueLoop
    $sHold &= $aFSplit[$iCC] & Chr(1)
    EndSwitch
    Next
    If StringTrimRight($sHold, 1) Then Return StringSplit(StringTrimRight($sHold, 1), Chr(1))
    Return SetError(4, 4, '')
    EndFunc

    [/autoit]

    Ich wollte fragen wie ich das verbessern kann.

    ggf müsst ihr den Pfad in z.13 anpassen ;)

    Danke

    DFPWare