AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi libvlc_media_player_set_position startet Datei neu
Thema durchsuchen
Ansicht
Themen-Optionen

libvlc_media_player_set_position startet Datei neu

Ein Thema von Christian Seehase · begonnen am 17. Feb 2024 · letzter Beitrag vom 17. Mär 2024
Antwort Antwort
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#1

libvlc_media_player_set_position startet Datei neu

  Alt 17. Feb 2024, 21:45
Moin Zusammen,

da der TMediaPlayer mit langen Dateipfaden nicht umgehen kann, habe ich nach einer anderen Lösung gesucht.
(das Setzen von LongPathsEnabled in der Registry hat auch nicht geholfen).

Hier im Forum bin ich dann auf
LibVLC - VLC in Delphi nutzen
gestossen, bekomme es aber nicht zum Laufen.
Da mir die Nutzung von VLC aber als sinnvoll erschien, habe ich noch nach weiteren Möglichkeiten gesucht und habe das hier gefunden:
Using libvlc with Delphi
Nachdem ich herausbekommen hatte, dass man nicht nur den Pfad auf die beiden DLLs benötigt, sondern auf eine volle Installation, hat das bei mir soweit auch funktioniert, nur eines bekomme ich nicht hin.

Die Funktion libvlc_media_player_set_position startet die laufende Datei von Vorne.

Importiert habe ich sie wie folgt

  libvlc_media_player_set_position : function(p_media_player : Plibvlc_media_player_t;f_pos : double;b_fast : integer) : integer; cdecl; und der Aufruf sieht so aus:

  iError := libvlc_media_player_set_position(vlcMediaPlayer,0.5,1); Mit boolean für den letzten Parameter und wechselnden Werten für diesen Parameter ändert sich nichts. iError ergibt immer 0 (kein Fehler), aber die Datei wird immer neu abgespielt.
Es spielt auch keine Rolle, welcher Dateityp es ist (mp3,wav,mpg,flv,wmv)

Wenn ich danach suche, finde ich nichts passendes.
Ausprobiert habe ich VLC (32-Bit) 2.2.5.1 / 3.0.2 / 3.0.20

Kennt jemand dieses Problem?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#2

AW: libvlc_media_player_set_position startet Datei neu

  Alt 17. Feb 2024, 23:34
Zitat:
das Setzen von LongPathsEnabled in der Registry hat auch nicht geholfen
Es muß sowohl im Windows (Registry), als auch nochmal im Programm (Manifest) aktiviert werden.

Im Manifest vom Delphi fehlt es aber.
XML-Code:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
        <ws2:longPathAware>true</ws2:longPathAware>
    </windowsSettings>
</application>
https://learn.microsoft.com/de-de/wi...?tabs=registry

Es wäre auch grob fahrlässig, wenn das einfach so bei Programmen aktiviert würde, welche mit statischen Buffern (MAX_PATH) arbeiten und die Länge der Pfade nicht prüfen. (Buffer-Overflow)



UNC-Pfade helfen auch nicht?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Feb 2024 um 23:38 Uhr)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: libvlc_media_player_set_position startet Datei neu

  Alt 18. Feb 2024, 10:54
Moin himitsu,

danke für den Tip.
Den Abschnitt mit der Manifestdatei hatte ich übersehen
Leider hat das auch nicht geholfen.
Der Abschnitt hier:
Maximale Längenbeschränkung für Pfade
den Du auch gepostet hast führt bei mir zu einer ungültigen Manifest-Datei.
Hiermit
Anwendungsmanifeste / longPathAware
konnte die Anwendung dann auch starten.
Code:
  <asmv3:application>
    <asmv3:windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
      <ws2:longPathAware>true</ws2:longPathAware>
    </asmv3:windowsSettings>
  </asmv3:application>
Allerdings hat das auch nicht geholfen.

Ich vermute mal, dass die Basis des TMediaPlayers (MCI) einfach langen Pfaden gegenüber resistent ist
MCI ist ja auch nicht wirklich aktuell.

Die Lösung ist allerdings viel einfacher, wie ich inzwischen rausfinden konnte:
Man muss nur den Pfad mit GetShortPathName in einen kurzen Pfad umwandeln.
Dann tut es auch der TMediaPlayer.

Dennoch wäre ich daran interessiert warum libvlc_media_player_set_position nicht das tut, was es soll, bzw. ob auch andere das Problem haben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: libvlc_media_player_set_position startet Datei neu

  Alt 16. Mär 2024, 14:25
Moin Zusammen,

wieso libvlc_media_player_set_position nicht das tut, was man gemäss Doku erwarten könnte
habe ich zwar nicht ermitteln können, aber um in der Datei zu navigieren kann man
libvlc_media_player_get_length
libvlc_media_player_get_time
libvlc_media_player_set_time
benutzen, falls noch andere an dieser Funktionalität interessiert sind.

Eine funktionierende Beispielanwendung kommt noch.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: libvlc_media_player_set_position startet Datei neu

  Alt 17. Mär 2024, 10:23
Moin Zusammen,

anbei die Beispielanwendung, allerdings erstellt mit Lazarus, da es,
für meinen Geschmack, einfacher ist das Ganze dann auch auf einen
Mac zu übertragen.

Das Programm besteht aber auch nur aus wenigen Bestandteilen.
Zwei TPanel (pnlControl Alignment Bottom, pnlDisplay Alignment Client)
Drei TButton (btnStart, btnPause, btnStop)
Eine TTrackBar (tbMain Anchors Top/Left/Right)
Button und Trackbar kommen auf das pnlControl.

Die Basis für die uncslibvlc.pas stammt von
Using libvlc with Delphi

Die Informationen für weitere Funktionen usw. stammen aus
VLC 4.0.0-dev

Wichtig:
Bei einigen Punkten wird als als Voraussetzung Version 4.0.0
angegeben. Da VLC derzeit aber nur bis 3.0.20 als Release zur
Verfügung steht können die noch nicht verwendet werden.
Man könnte nur ein Nightly Build von 4.0 ausprobieren.
Angehängte Dateien
Dateityp: zip LibVLCDemo.zip (4,7 KB, 3x aufgerufen)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
msohn

Registriert seit: 2. Mai 2013
Ort: Leipzig
4 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: libvlc_media_player_set_position startet Datei neu

  Alt 17. Mär 2024, 14:14
Moin - da ich mich gerade selber mit API-Imports rumschlage, fiel mir das ins Auge:

Zitat:
Importiert habe ich sie wie folgt

libvlc_media_player_set_position : function(p_media_player : Plibvlc_media_player_t;f_pos : double;b_fast : integer) : integer; cdecl; und der Aufruf sieht so aus:
Laut https://videolan.videolan.me/vlc/gro...2b8ea61c3cb79d ist der letzte Parameter b_fast ein "bool" in C. Der hat eine Größe von 1 - und nicht 4 wie Dein Integer. Für solche API-Aufrufe gibt es extra System.ByteBool, wobei mit Einschränkungen (keine Vergleiche) auch Boolean funktioniert.

Das wird ziemlich sicher die Ursache sein, weil die Argumente bei cdecl in umgekehrter Reihenfolge auf dem Stack liegen und damit dein b_fast zu groß ist und beim Aufruf damit zT an der Stelle steht, wo f_pos erwartet wird.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: libvlc_media_player_set_position startet Datei neu

  Alt 17. Mär 2024, 16:35
Moin msohn,

danke für den Tip.
Ich hatte es inzwischen schon auf boolean geändert gehabt.
Mit ByteBool und auch Byte (um ganz sicher zu gehen) bleibt das Verhalten aber leider bestehen.
Wenn der Parameter durch seine Länge die anderen Parameter in Mitleidenschaft gezogen hätte,
hätte allerdings auch der Aufruf fehlschlagen müssen, da dann ja der erste Parameter ungültig
gewesen wäre, mit dem ja auf die Mediaplayerinstanz referenziert wird.
Ich bekomme aber auch immer nur 0 zurück, also "Aufruf erfolgreich".
Leider kann ich es auf dem Mac nicht testen, da hier schon libvlc_new fehlschlägt, also
nur nil zurückliefert und das mit den empfohlenen Parameter 0 und nil.
Ich muss mal schauen, was libvlc_errmsg zurückliefert.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz