Mediaplayer mit vlc

Für allgemeine Fragen zur Programmierung mit PureBasic.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Mediaplayer mit vlc

Beitrag von BSP »

Hallo Allerseits. Könnt Ihr helfen?
Ich möchte mich mal wieder mit meinem Mediaplayer beschäftigen.
Bisher habe ich die "mciSendString_" Funktionen genutzt.
Hat funktioniert, aber wirklich zufrieden bin ich damit nicht.
Nun habe ich immer wieder von den "vlc" Funktionen gehört und möchte die mal ausprobieren.
Dazu habe ich mir die Datei "vlc-3.0.21-win64.zip" bei vlc besorgt und in dem Ordner "c:\vlc\" entpackt. Darin befinden sich u.a. die Dateien "libvlc.dll" und "libvlccore.dll". Ich habe gelesen, die werden benötigt. Darin verbergen sich die Media- Funktionen.
Nun tue ich mich leider verdammt schwer damit.
Darum stelle ich hier mal ein Grundgerüst hinein in der Hoffnung, das mir jemannd die "vlc" Funktionen ergänzen kann.
Ich lerne am besten an funktionierende Beispiele an denen ich mich dann so richtig austoben kann.
Darum meine Hoffnung, das Ihr mir weiter helft.

Ich bedanke mich schon mal im voraus. Vielen Dank.
BSP.

Code: Alles auswählen

;EnableExplicit

#VLC_Pfad = "C:\vlc"  ; <<< ANPASSEN an dein System

Global libVLC, vlcInstance, vlcPlayer, videoPfad.s
videoPfad = OpenFileRequester("Video auswählen", "", "", 0)

Procedure StartVLC(videoFile.s, hwnd)
  If libVLC = 0
    libVLC = OpenLibrary(0, #VLC_Pfad + "\libvlc.dll")
    ;Debug #VLC_Pfad + "\libvlc.dll"
    Debug libVLC
    If libVLC = 0
      MessageRequester("Fehler", "Konnte libvlc.dll nicht laden!")
      End
    Else
      Debug "libVLC geladen: " + Str(libVLC)
    EndIf
    
  EndIf
  
  ; LibVLC initialisieren
  vlcInstance = CallFunction(libVLC, "libvlc_new", 0, #Null) ; <<< Hier bekomme ich immer einen Fehler.
  If vlcInstance = 0
    Debug "Fehler: vlcInstance = 0"
    MessageRequester("Fehler", "Fehler beim Initialisieren von libVLC!")
  Else
    Debug "LibVLC erfolgreich initialisiert!"
  EndIf
  vlcPlayer = CallFunction(libVLC, "libvlc_media_player_new", vlcInstance)
  Debug vlcPlayer
  If vlcPlayer
    ; Video-Datei laden
    Define media = CallFunctionFast(GetFunction(libVLC, "libvlc_media_new_path"), vlcInstance, @videoFile)
    Debug media
    CallFunction(libVLC, "libvlc_media_player_set_media", vlcPlayer, media)
    
    ; In PureBasic-Fenster rendern (HWND)
    CallFunction(libVLC, "libvlc_media_player_set_hwnd", vlcPlayer, hwnd)
    
    ; Video abspielen
    CallFunction(libVLC, "libvlc_media_player_play", vlcPlayer)
  EndIf
EndProcedure

Procedure StopVLC()
  If vlcPlayer
    CallFunction(libVLC, "libvlc_media_player_stop", vlcPlayer)
    CallFunction(libVLC, "libvlc_media_player_release", vlcPlayer)
  EndIf
  If vlcInstance
    CallFunction(libVLC, "libvlc_release", vlcInstance)
  EndIf
  If libVLC
    CloseLibrary(0)
    libVLC = 0
  EndIf
EndProcedure

; Fenster erstellen
If OpenWindow(0, 100, 100, 800, 600, "VLC in PureBasic", #PB_Window_SystemMenu)
  CanvasGadget(0, 50, 50, 640, 480)
  
  ButtonGadget(1, 50, 550, 100, 30, "Play Video")
  ButtonGadget(2, 200, 550, 100, 30, "Stop")
  
  Repeat
    Define Event = WaitWindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 ; Play Button
            StartVLC(videoPfad, GadgetID(0))
           
            
          Case 2 ; Stop Button
            StopVLC()
        EndSelect
        
      Case #PB_Event_CloseWindow
        StopVLC()
        Break
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
EndIf
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Mediaplayer mit vlc

Beitrag von H.Brill »

Ist denn keine Dokumentation dabei ?
Man kann zwar mit ExamineLibraryFunctions() nach dem Öffnen die Funktionsnamen
mittels LibraryFunctionName() bzw. LibraryFunctionAddress() die Adressen in einer Schleife ermitteln,
nutzt aber wenig, wenn man die Funktionsparameter und deren Anzahl nicht kennt.
Da aber 2 DLLs im Spiel sind, kann es sein, daß die eine die andere braucht.
Solche Core-Libraries sind meist so Grundlibraries, die vorher irgendwelche Initialisierungen
übernehmen und die eigentlichen Funktionen in der anderen Library zu finden sind.
Kann aber auch ganz anders sein. Nur so zum Spaß gibt es ja nicht 2 DLLs.

Ich würde mal sagen, lade mal zuerst die core-lib und dann die andere, bevor du auf die
Funktionen zugreifst. Es kann sein, daß die core-lib die Haupt-lib ist und die andere die
Plugins beinhaltet.

Aber wie gesagt : ohne Doku wird das schwierig.
PB 6.10
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Mediaplayer mit vlc

Beitrag von Axolotl »

Moin,
probier mal diesen Link: libVLC in pb (Windows Only)
oder Trying to use LibVLC with PureBasic
Oder gib in deiner Lieblingssuchmachine die folgende Zeile ein:

Code: Alles auswählen

libvlc.dll site:purebasic.fr
Da sollte doch was dabei sein, was dir weiterhilft.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Mediaplayer mit vlc

Beitrag von BSP »

Hallo Axolotl.
Super. Vielen Dank.
Der Link : libVLC in pb (Windows Only) hat weiter geholfen.
Dort der Link: https://www.mediafire.com/file/jkqzr8sf ... b.zip/file
hat PB Programme geliefert, die funktioniert haben.
Nun habe ich einen guten Anfang und kann herumexperimentieren.
Danke.

Hallo H.Brill.
Mit LibraryFunctionName() habe ich auch schon experimentiert.

Code: Alles auswählen

datei$ = "c:\vlc\libvlc.dll"
OpenLibrary(0, datei$)
ExamineLibraryFunctions(0)
While NextLibraryFunction()
  Debug LibraryFunctionName()
Wend
CloseLibrary(0)
Damit werden die einzelnen Funktionen angezeigt.
Vieleicht kann ich dadurch ja zu den einzelnen Funktionen Beschreibungen im Netz finden.

MfG: BSP (Bernd)
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Mediaplayer mit vlc

Beitrag von H.Brill »

BSP hat geschrieben: 04.03.2025 04:21 Vieleicht kann ich dadurch ja zu den einzelnen Funktionen Beschreibungen im Netz finden.
MfG: BSP (Bernd)
Genauso mache ich das auch immer. (auch bei der Windows-API).
PB 6.10
Antworten