Multimediawiedergabe z.B. über VLC

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Hallo Zusammen,

ich möchte ein speziell für meine Zwecke angepasstes Präsentationsprogramm schreiben. Aus diesem heraus soll es auch möglich sein Audio-Dateien und Videos wiederzugeben. Dabei sollten möglichst viele Formate unterstützt werden. Dieser Programmteil muss auf Windows lauffähig sein, es wäre aber auch schön, wenn es auch unter Linux laufen würde.

Also habe ich mir gedacht: Warum das Rad neu erfinden? Ich benutze einfach VLC. Dieser frisst so gut wie alles, ist auf den meisten PCs installiert - zumindest in meinem Umfeld - und ich habe ihn auch unter Linux.

So weit so gut. Jetzt kommt das eigentliche Problem: Ich bekomme es weder hin VLC über TProcess zu starten und dann per pipe zu steuern, noch mit der vlclib.

Über TProcess kommt der Befehl entweder nicht an (es passiert gar nichts) oder es kommt die Fehermeldung "Stream write error". Dies ist der dazugehörige Quelltext (Entsprechende zusätzliche Versuche sind auskommentiert):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  P := TProcess.Create(nil);
  P.CommandLine := 'C:\Programme\VideoLAN\VLC\vlc.exe --extraintf rc';
  P.Options := [poUsePipes];
  P.Execute;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  P.Input.WriteAnsiString('help');
  //P.Stderr.WriteAnsiString('help');
end;
Ein zweiter ähnliche Versuch nutzt die Komponente TProcessLineTalk:

Code: Alles auswählen

procedure TForm1.Button4Click(Sender: TObject);
begin
  PLT:=TProcessLineTalk.Create(Self);
  PLT.CommandLine := 'C:\Programme\VideoLAN\VLC\vlc.exe -I rc';
  //PLT.CommandLine := 'C:\Programme\VideoLAN\VLC\vlc.exe --extraintf rc';
  //PLT.CommandLine := 'C:\Programme\VideoLAN\VLC\vlc.exe --rc-host localhost:4212';
  PLT.Options := PLT.Options + [poUsePipes];
  PLT.Execute;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var commandstr:String;
begin
  //commandstr:='help'+LineEnding;
  //PLT.Input.write(commandstr[1], length(commandstr));
  PLT.WriteLine('help');
  //PLT.WriteLine('add F:\XXXXXXX\Eigene Dateien\Eigene Musik\XXXXXXXXXXX\XXXXXXXXXXXXXXX.mp3');
end;
Nun zu libvlc:
Ich habe eine leicht abgewandelte Version (um die Kompatibilität zu fpc/lazarus herzustellen) von IceVLCPlayer angewendet. Hier bekomme ich die Bibliothek nicht geladen, obwohl die Datei unter diesem Pfad existiert (überprüft mit FileExists). Die Funktion LoadLibrary gibt immer das Handle 0 zurück. Dabei ist es unerheblich, ob die Version aus der Unit Windows, oder aus der Unit DynLibs verwendet wird.

Ach so: Statisch gelinkt schmiert das Programm beim Start ab, da die DLL ebenfalls nicht gefunden wird.

Hat jemand eine Idee, wie ich das Problem lösen kann?

Und noch etwas: Zur Zeit programmiere ich mit der aktuellsten Version unter Windows XP SP3.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Multimediawiedergabe z.B. über VLC

Beitrag von _X_ »

http://www.lazarusforum.de/viewtopic.ph ... 301#p38301" onclick="window.open(this.href);return false;

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Die dort verwendete Komponente habe ich auch schon ausprobiert. Diese ist der IceVLCPlayer-Komponente sehr ähnlich (ausschließlich statisch gelinkt und geringerer Funktionsumfang) und ist grundsätzlich erst einmal für GTK2 geschrieben. Nach dem Umbauen auf Windows (mit {$IFDEF WINDOWS}...{$ENDIF} bzw. {$IFDEF LINUX}...{$ENDIF}) hatte ich das selbe Problem. Die DLL konnte auch dort nicht eingebunden werden.

Ich bekomme die Fehlermeldung

Code: Alles auswählen

Debuggerfehler
 
Der Debugger ist abgestürzt.
Speichern Sie ihre Arbeit!
 
Drücken Sie "OK" und hoffen Sie auf einen Fix für diesen Bug.
 
[OK]
Die abgeänderten Dateien habe ich mal hochgeladen.
Dateianhänge
vlcplayer.pas
(3.27 KiB) 120-mal heruntergeladen
libvlc.pas
(10.99 KiB) 123-mal heruntergeladen

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Multimediawiedergabe z.B. über VLC

Beitrag von _X_ »

Der Fehler sagt mir erst mal nix. Ohne Debugger gibts ja auch nichts aufschlussreiches zu sehen.
Der Player selbst ist für qt/windows auch relativ leicht hinzubekommen.
Meine Komponente zeigt im Normalfall nur v4l2-kammeras, weil ich keinen größeren Funktionsumfang gebraucht habe.
Läuft dein Programm ohne Debugger?

mfg _X_

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Ich bekomme dort folgende Fehlermeldung:

Code: Alles auswählen

Die Anwendung konnte nicht gestartet werden, weil libvlc.dll nicht gefunden wurde. Neuistallation der Anwendung könnte das Problem beheben
Den selben Fehler bekomme ich auch bei der statischen variante von IceVlcPlayer. Bei der dynamischen Variante habe ich das selbe durch einbau von ShowMessage(...) herausbekommen.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Multimediawiedergabe z.B. über VLC

Beitrag von Socke »

Windows weiß wahrscheinlich gar nicht, wo die libvcl.dll liegt, weil du es ihm nicht gesagt hast.
Die Bibltioheken müssen entweder irgendwo über die Umgebungsvariable "PATH" gefunden werden können (wie man diesse ändert, sagt dir google) oder im Verzeichnis mit deiner Exe-Datei liegen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Nein, ich habe den kompletten Pfad angegeben (C:\Programme\VideoLAN\VLC\libvlc.dll) dort befindet Sie sich auch. Das sollte also kein Problem sein. Jedenfalls sucht sich die dynamische Variante von IceVLCPlayer an dieser Stelle ja auch aus der Regestry den absoluten Pfad.

Ich habe das ganze jetzt mal mit Delphi versucht zu kompilieren. Dazu musste ich natürlich in der Kopie {$DEFINE WINDOWS} einfügen und {$mode objfpc}{$H+} auskommentieren. Dort bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Die Anwendung konnte nicht gestartet werden, weil libvlccore.dll nicht gefunden wurde. Neuistallatuon der Anwendung könnte das Problem beheben.
Die libvlccore.dll befindet sich im selben Ordner wie die libvlc.dll. Eventuell liegt also das Problem in der DLL selber und nicht im Programm.

Ich habe jetzt mal die neueste Version von VLC installiert. Ich habe nun Version 1.1.0, zuvor hatte ich die Version 1.0.1. Auch mit dieser Version tritt der Fehler auf.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Multimediawiedergabe z.B. über VLC

Beitrag von Teekeks »

Das Problem kenne ich, Kopiere diese DLL wirklich in deinen Programm-Pfad (auch wenn der Suchpfad richtig sein mag). Mir ist auch schon einmal aufgefallen das der nicht im Windows-Pfad sucht...

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Damit funktioniert es tatsächlich. Ist nur blöd, dass man die DLLs (vlclib und libvlccore)kopieren muss. Eigentlich sollte das auch so gehen.

Ich habe es auch mal mit der IceVLCPlayer-Komponente versucht. Die findet die DLLs nun auch. Allerdigs treten da immer noch Fehler auf und zwar beim einbinden der Funktionen. Dies habe ich mal die Handles samt Funktionsname in ne Textdatei schreiben lassen:

Code: Alles auswählen

libvlc_new: 1781535552
libvlc_destroy: 0
libvlc_exception_clear: 0
libvlc_playlist_add: 0
libvlc_playlist_add_extended: 0
libvlc_playlist_clear: 0
libvlc_playlist_items_count: 0
libvlc_playlist_isplaying: 0
libvlc_playlist_play: 1781537728
libvlc_playlist_pause: 0
libvlc_playlist_stop: 0
libvlc_playlist_next: 0
libvlc_playlist_prev: 0
libvlc_playlist_get_input: 0
libvlc_input_free: 0
libvlc_input_get_length: 0
libvlc_input_get_time: 0
libvlc_input_get_position: 0
libvlc_toggle_fullscreen: 1781549264
libvlc_set_fullscreen: 1781549792
libvlc_get_fullscreen: 1781547968
libvlc_video_get_width: 1781546976
libvlc_video_get_height: 1781547040
libvlc_audio_get_mute: 1781554896
libvlc_audio_set_mute: 1781554928
libvlc_audio_get_volume: 1781554848
libvlc_audio_set_volume: 1781554752
libvlc_video_set_parent: 0
Und ob die andere Funktioniert, kann ich nicht herausfinden, da ich nur Dateien abspielen kann.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Multimediawiedergabe z.B. über VLC

Beitrag von _X_ »

t-z hat geschrieben:DUnd ob die andere Funktioniert, kann ich nicht herausfinden, da ich nur Dateien abspielen kann.
In PlayCam von meiner Komponente wird eine Normale MRL verwendet. Die Kannst du einfach auf C:\...Datei ändern.

mfg _X_

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Dort habe ich das selbe Problem. Sowohl die Funktion libvlc_playlist_add_extended, als auch die Funktion libvlc_playlist_add wird nicht gefunden.

Ich glaube ich habe das Problem gefunden:
Die bisher verwendeten Komponenten sind für libvlc 0.0.8 und niedriger geschrieben. Es wird laut dieser Seite (bzw. weitergeklickt) empfohlen die libvlc_media_list zu nutzen. In den von mir verwendeten Versionen (1.0.1 und 1.1.0) ist die alte Variante anscheinend nicht mehr vorhanden. Ich habe allerdings eine weiterentwickelte Version von IceVLCPlayer gefunden. Diese ist hier zu finden. Jetzt muss ich mal schauen, ob und wie ich damit weiter komme. Auf jedem Fall dürfte diese mir das umschreiben von nem Haufen Funktionsdefinitionen von C in Pascal ersparen - die Dokumentation ist schließlich voll auf C ausgerichtet. Jetzt muss ich erst einmal die alten, nicht mehr vorhandenen Funktionen herausbekomme. Dies ist die neue Liste:

Code: Alles auswählen

libvlc_new: 1781535552
libvlc_release: 1781535408
libvlc_exception_clear: 0
libvlc_playlist_add: 0
libvlc_playlist_add_extended: 0
libvlc_playlist_clear: 0
libvlc_playlist_items_count: 0
libvlc_playlist_isplaying: 0
libvlc_playlist_play: 1781537728
libvlc_playlist_pause: 0
libvlc_playlist_stop: 0
libvlc_playlist_next: 0
libvlc_playlist_prev: 0
libvlc_playlist_lock: 0
libvlc_playlist_unlock: 0
libvlc_playlist_get_media_player: 0
libvlc_media_new: 0
libvlc_media_get_mrl: 1781564016
libvlc_media_release: 1781564048
libvlc_media_add_option: 1781564480
libvlc_media_player_release: 1781567552
libvlc_media_player_new: 1781567776
libvlc_media_player_new_from_media: 1781569440
libvlc_media_player_play: 1781567056
libvlc_media_player_get_length: 1781572384
libvlc_media_player_get_time: 1781572224
libvlc_media_player_get_position: 1781571344
libvlc_media_player_set_time: 1781571600
libvlc_media_player_set_position: 1781571488
libvlc_media_player_stop: 1781566672
libvlc_media_player_play: 1781567056
libvlc_media_player_pause: 1781571744
libvlc_media_player_get_state: 1781565808
libvlc_toggle_fullscreen: 1781549264
libvlc_video_get_width: 1781546976
libvlc_video_get_height: 1781547040
libvlc_set_fullscreen: 1781549792
libvlc_get_fullscreen: 1781547968
libvlc_audio_get_mute: 1781554896
libvlc_audio_set_mute: 1781554928
libvlc_audio_get_volume: 1781554848
libvlc_audio_set_volume: 1781554752
libvlc_video_set_parent: 0
libvlc_video_take_snapshot: 1781550656
libvlc_media_list_player_new: 1781576400
libvlc_media_list_player_release: 1781580816
libvlc_media_list_player_set_media_player: 1781578016
libvlc_media_list_new: 1781574928
libvlc_media_list_player_set_media_list: 1781577856
libvlc_media_list_add_file_content: 1781574544
libvlc_media_list_player_next: 1781580720
libvlc_media_list_player_play: 1781581072
libvlc_media_list_count: 1781573248
libvlc_media_discoverer_new_from_name: 1781582480
libvlc_media_discoverer_media_list: 1781581712
libvlc_media_list_add_media: 1781574464
libvlc_media_list_lock: 1781573520
libvlc_media_list_unlock: 1781573504
libvlc_media_subitems: 1781563392
libvlc_media_list_player_play_item_at_index: 1781577568
libvlc_media_list_release: 1781574752
libvlc_media_player_get_media: 1781566464
libvlc_playlist_get_current_index: 0
libvlc_media_player_has_vout: 1781547104
libvlc_media_player_is_seekable: 1781570032
libvlc_media_player_get_rate: 1781565600
libvlc_media_player_set_rate: 1781570144
libvlc_media_player_get_chapter_count: 1781571136
libvlc_media_player_retain: 1781565904
Ich habe nun im Präprozessor die entsprechenden Funktionszuweisungen rausgefischt.

Dummerweise benutzt die Funktion Play der Komponente die alten Funktionen, sodass bei benutze die Fehlermeldung

Code: Alles auswählen

Project project1.exe raises exception class 'External: SIGSEGV'.
Nach dem OK öffnet sich das Fenster Assembler.
Da dies mir jetzt schon mehrfach irgendwo passiert ist, habe ich die Frage, ob dies unter Lazarus die Fehlermeldung für eine Speicherverletzung ist.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Multimediawiedergabe z.B. über VLC

Beitrag von pluto »

Ich hatte am Anfang auch Starke Probleme mit den VLCLib und den genannten Projekten. Ich kam dahinter, dass man die Adressen für die Funktions Aufrufe manuell laden muss. Diese Werden anscheint nicht Automatisch geladen.

Und am besten hat es mit dem Delphi-Modus geklappt.

eidt01:
Einfacher geht es mit dem mplayer. er müsste auch unter Windows lauffähig sein.
MFG
Michael Springwald

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Den Trick habe ich inzwischen auch raus. Damit muss ich vor die Zuweisung der Event-Prozeduren auch kein @ mehr setzen bzw. um die Funktionen ein Pointer(...) setzen. Eigentlich sind die ganzen units ja auch für Delphi geschrieben.

Was meinst du mit manuell? Falls du statisch meinst: Dort gibt es bei den selben Funktionen Probleme (ich habe nicht alle Ausprobiert, aber die die Probleme machen, verhindern das Benutzen der lib mit den alten älteren Funktionen dennoch vollständig).

Dummerweise habe ich bis jetzt nichts gefunden, was klappen könnte, da immer mehrere Funktionen fehlen. Das Übertragen von C (was anderes vernünftiges finde ich kaum) in Pascal scheitert also immer schon in diesem ersten Schritt. Also bin ich gerade mal ein wenig am probieren.

Allerdings funktioniert es auch sonst nicht. So erzeugt zum Beispiel die Funktion libvlc_media_list_new immer die im letzten Post beschriebene Fehlermeldung, obwohl die Funktion zugewiesen und auch an die neue Version angepasst ist:

Code: Alles auswählen

libvlc_media_list_new: function(vlc: libvlc_instance):libvlc_media_list;cdecl ;
Dies ist übrigens nicht die einzige Funktion, mit der ich dieses Problem habe. Inzwischen könnte ich mindestens 5 auflisten.

Inzwischen weiß ich, dass alle von mir 'entfernten' Funktionen auch in der Dokumentation nicht existieren. Dagegen bekam ich von allen die dort zu finden sind auch eine Adresse. Wenigstens etwas positives, denn ich muss da nicht mehr ausprobieren!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Multimediawiedergabe z.B. über VLC

Beitrag von pluto »

Mit Manuell meine ich, dass du die Procedur wo die Funktionen für die DLL geladen werden, selbst aufrufen musst.

Da war auch noch was mit dem Versions-String. Denn musst du anpassen.

Ich habe hier mal meine Hochgeladen, die ich angepasst habe, so das die bei mir unter Linux Problemlos läuft.

Du musst die Funktion: VLD_Startup vorher aufrufen.
Dateianhänge
libVLC.pas
(11.21 KiB) 125-mal heruntergeladen
MFG
Michael Springwald

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Multimediawiedergabe z.B. über VLC

Beitrag von t-z »

Die Funktion wird aufgerufen. Das Problem liegt wo anders: ich bekomme von der Funktion libvlc_new nil zurück. Eine Fehlermeldung wird aber nicht zurückgegeben. Wenn die DLL dann auf nil zugreift passiert die Speicherverletzung. Jetzt heißt es erst mal googlen.

Antworten