Seite 1 von 1

VLCLIB - Dauer des Videos vorab auslesen

Verfasst: 27.12.2025 15:00
von stab
war gerade hier unterwegs

https://www.purebasic.fr/english/viewtopic.php?t=75564

brauchte aber eine Funktion, die mir vorab die Dauer eines Videos ausliest.

Code: Alles auswählen


; ChatGPT generiert am 27.12.25


; Wichtige Hinweise aus der Praxis
; 
; libvlc_media_get_duration() → Millisekunden
; 
; Funktioniert vor dem Abspielen
; 
; Für Streams besser:
; 
; libvlc_media_parse_with_options(media, #libvlc_media_parse_network, -1)




; --- Parse-Flags ---
#libvlc_media_parse_local          = 0
#libvlc_media_parse_network        = 1
#libvlc_media_parse_fetch_local    = 2
#libvlc_media_parse_fetch_network  = 4

ImportC "libvlc.lib"

  ; --- Core ---
  libvlc_new(argc.i, argv.i)
  libvlc_release(instance.i)

  ; --- Media ---
  libvlc_media_new_path(instance.i, path.p-utf8)
  libvlc_media_new_location(instance.i, location.p-utf8)
  libvlc_media_release(media.i)

  libvlc_media_parse(media.i)
  libvlc_media_parse_with_options(media.i, flags.i, timeout.i)
  libvlc_media_is_parsed(media.i)

  libvlc_media_get_duration(media.i) ; Rückgabe: Quad (ms)

  ; --- Media Player ---
  libvlc_media_player_new_from_media(media.i)
  libvlc_media_player_release(player.i)

EndImport

;EnableExplicit

; -------------------------
; Hilfsfunktion Zeitformat
; -------------------------
Procedure.s FormatTime(ms.q)
  Protected sec.q = ms / 1000
  Protected h = sec / 3600
  Protected m = (sec % 3600) / 60
  Protected s = sec % 60

  ProcedureReturn RSet(Str(h), 2, "0") + ":" +
                   RSet(Str(m), 2, "0") + ":" +
                   RSet(Str(s), 2, "0")
EndProcedure

; -------------------------
; GUI
; -------------------------
OpenWindow(0, 0, 0, 420, 140, "libVLC – Videolänge", #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 120, 30, "Video laden")
TextGadget(2, 10, 60, 400, 30, "Dauer: -")

; -------------------------
; VLC Initialisierung
; -------------------------
vlc.i = libvlc_new(0, 0)

If vlc = 0
  MessageRequester("Fehler", "libVLC konnte nicht initialisiert werden.")
  End
EndIf

; -------------------------
; Event-Loop
; -------------------------
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break

    Case #PB_Event_Gadget
      If EventGadget() = 1

        file.s = OpenFileRequester("Video auswählen", "", 
                                             "Videos|*.mp4;*.mkv;*.avi|Alle|*.*", 0)
        If file = ""
          Continue
        EndIf

        media.i = libvlc_media_new_path(vlc, file)

        If media = 0
          MessageRequester("Fehler", "Media konnte nicht geladen werden.")
          Continue
        EndIf

        ; --- Parsen (blockierend) ---
        libvlc_media_parse(media)
        
        duration.q = libvlc_media_get_duration(media)

        If duration > 0
          SetGadgetText(2, "Dauer: " + FormatTime(duration))
        Else
          SetGadgetText(2, "Dauer: unbekannt")
        EndIf

        libvlc_media_release(media)

      EndIf
  EndSelect
ForEver

libvlc_release(vlc)