VLCLIB - Dauer des Videos vorab auslesen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
stab
Beiträge: 101
Registriert: 24.02.2006 16:09
Computerausstattung: 286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Wohnort: Hardt
Kontaktdaten:

VLCLIB - Dauer des Videos vorab auslesen

Beitrag 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)



Paul sagt: "Max lügt."
Max sagt: "Otto lügt."
Otto sagt: "Max und Paul lügen."

Wer lügt hier wirklich und wer sagt die Wahrheit?

_________________________________________

286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5