August 15, 2020, 07:06:11

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


VLC-Active-X

Begonnen von crystal, Mai 17, 2020, 17:47:51

⏪ vorheriges - nächstes ⏩

crystal

Hallo Gemeinde,

hier eine schwierige Frage für Spezialisten...

In meiner entstehenden Movie-Applikation habe ich VLC-Active-X in einem Formular benutzt, um Videos anzuzeigen.

Funktioniert auch einigermaßen.

Wenn ich aber das Formular (mit dem VLC-Control) schließe, ohne vorher das Video gestoppt zu haben, verabschiedet sich ACCESS manchmal ins Nirvana - ohne Fehlermeldung (ähnliche Erfahrungen hatte ich auch mit dem MS-MediaPlayer-Control).

Also habe ich im Form_Close-Event versucht, das VLC-Element zu stoppen und dann zu löschen. Resultat: Nirvana.

Muss ich das VLC-Objekt vielleicht global deklarieren, um dann im Form-Close-Event ein .Stop schicken zu können??? Momentan wird ein VLC-Objekt in Form_Current erzeugt und das Video läuft dann auch erwartungsgemäß, auch beim Wechsel zu einem anderen Datensatz. Ich mache das so:
   
(Form_Current)
...
Dim player As VLCPlugin2

    Set player = Me.VLCPlugin21.Object
    player.Playlist.Stop
    player.Playlist.Items.Clear
    player.Playlist.Add "File:///" & MovieFileName       ' "File:///" ist zwingend erforderlich
    player.Playlist.play



Ohne über die Playlist zu gehen, funktioniert irgendwie nicht (mangels Dokumentation). Mit .BaseURL oder .MRL habe ich die Videos nicht zum Laufen bekommen. Sowieso klappt es erst, wenn man die 32-Bit-Variante von VLC installiert  (vermutlich weil MS-365 auch in der 32-Bit-Variante installiert wurde).

Wenn Form_Current verlassen wird, müsste ja auch player zerstört werden, und somit in Form_Close nicht mehr zur Verfügung stehen. Deshalb die Idee mit irgendeiner globalen Deklaration.

Also nochmal: sollte ich das VLC-Objekt z.B. im Form_Open-Event global anlegen (oder in einem globalen Modul), im Current-Event nur noch den Dateinamen und .Play übergeben, um im Form_Close-Event ein .Stop und .Clear absetzen zu können?

Und - sehr wichtig: gibt es irgendeinen Active-X-Wrapper für andere Media-Player, z.B. JVideo oder irgendwas, das man in Access zum Abspielen von Viedeos benutzen kann? MS-Mediaplayer und auch VLC lassen doch zu wünschen übrig...


Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

markus888

Zitat von: crystal am Mai 17, 2020, 17:47:51
Also nochmal: sollte ich das VLC-Objekt z.B. im Form_Open-Event global anlegen (oder in einem globalen Modul), im Current-Event nur noch den Dateinamen und .Play übergeben, um im Form_Close-Event ein .Stop und .Clear absetzen zu können?


Teste es und gib und Bescheid.  ;D
Glaube kaum, dass es was ändert.
Mit Form Current würde ich vermutlich nie arbeiten.
Einfach ein simples Menü erstellen, dass den Player steuert und den Player direkt ansprechen.
Auch das Schließen nur übe ein Menü machen, dann weißt du ja sicher ob der Player beendet wurde.
Vielleicht gibt es auch einen Status aufgrund dessen du weißt, ob der Player nun tatsächlich beendet wurde.
Möglicherweise braucht er da ja auch einige Millisekunden die du abwarten musst, oder es gibt ein Event das Bescheid gibt, wenn er tatsächlich beendet wurde.
10 Jahre Access

crystal

Hallo nochmal zum Thema.
Natürlich sind Formular-Steuerelemente immer global innerhalb des Formulars. Und natürlich bleibt das Steuerelement namens "VLCPlugin21" erhalten, wenn Form_Current verlassen wird. Hatte da neulich irgendwie ein Brett vor dem Kopf und versucht, auf die Variable "player" zuzugreifen......

Um Abstürze zumindest ganz erheblich zu reduzieren, muss man im Form_Close-Event schlicht so codieren:

...
   Me.VLCPlugin21.stop
   Me.VLCPlugin21.playlist.clear


Ich hatte versucht, "player" zu stoppen - player ist aber nur eine Variable in Form_Current und in Form_Close natürlich nicht erreichbar. Und natürlich kann man in Form_Current auch darauf verzichten, VLCPlugin21 auf player zu kopieren, indem man gleich schreibt:

Private Sub Form_Current()
    Me.VLCPlugin21.Playlist.Stop          'sicher ist sicher
    Me.VLCPlugin21.Playlist.Items.Clear   'sicher ist sicher
    Me.VLCPlugin21.Playlist.Add "File:///" & MovieFileName       ' "File:///" ist zwingend erforderlich
    Me.VLCPlugin21.Playlist.play
End Sub


Das "Me." ist natürlich auch nicht nötig, weil der Kontext eh schon das Formular ist...

Ja: manche Probleme lösen sich fast von selbst, wenn man sie sich etwas genauer anschaut... ;)
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Beaker s.a.

@crystal
ZitatDas "Me." ist natürlich auch nicht nötig

Wegen besserer Lesbarkeit würde ich es aber nie weglassen. Ich verwende
dann lieber With ... End With Blöcke.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

derArb

Hallo,
im Windows Mediaplayer kann man ja auch den Status auslesen.
If DeinWPlayerName.playState = WMPLib.WMPPlayState.wmppsPlaying Then....
oder
If DeinWPlayerName.playState = WMPLib.WMPPlayState.wmppsStopped Then....
Das Ganze gibts bestimmt auch im Objektkatalog für den VLC Player.
Das Ganze braucht man spätestens, wenn man eine Liste von Dateienlinks automatisch
als "play looped to the end of the list" abspielen will. Da wird dann auch ein Timer notwendig,
der evtl. Übergänge zwischen den Playstati verzögern muss (try and error im halb-Sekundebereich)
Ich kenne das aus meinem Musikplayer, der allerdings den Windows Mediaplayer benutzt.
http://www.office-loesung.de/p/viewtopic.php?f=167&t=815446&sid=35637c4f19fcc75aa484c3b505edc435&p=3247082#p3247082

crystal

Hallo derArb,

es gibt tatsächlich einen Status .playlist.isplaying, den man abfragen könnte.
Habe ich aber nicht probiert.
Ein unkonditionierter Stop geht ja auch, wenn VLC nichts abspielt.
Warum erst fragen, ob VLC spielt, wenn man sowieso stoppen möchte. Das wäre erst dann erforderlich, wenn VLC nicht gestoppt werden könnte, wenn nichts spielt. Aber dem ist wohl nicht so (das ist ja fast schon Fehlertoleranz ;) ).

Inzwischen tendiere ich doch eher dazu, den guten alten Windows Mediaplayer einzusetzen (seit 2012 nicht mehr geppflegt, leider) und meine Screenshots mit Windows-10-eigenen Tools zu machen oder mit dem erweiterten Open-Source-Projekt
https://getgreenshot.org

Ist mit .NET 4 entwickelt und wohl nicht als DLL mit VBA-Wrapper o.ä. verfügbar, aber sieht ganz gut aus...

Die Objekt-Dokumentation des Mediaplayer 12 ist ja recht ausführlich und/aber er bietet recht viele Möglichkeiten (Bibliotheken usw.), die ich nicht brauche (meine Bibliothek bzw. Videothek ist ja schon Access).

Und mit dem o. g. Screenshot-Tool kann ich auch gleich den Bild-Ausschnitt wählen, vergrößern, Verkleinern, Text einfügen, markieren, "rummalen" usw. Muss vielleicht bei Klicken eines Buttons zum Aktivieren des Snaptools den Mediaplayer pausen, aber das sollte ja möglich sein. Oder sogar "Pause", "Bild vorwärts/rückwärts", "Jetzt Shot" oder sowas. Muss da erst probieren.

Jedenfalls werde ich mich jetzt stärker mit dem MS-Mediaplayer.ActiveX beschäftigen, denn VLC ist mir langsam doch zu intransparent.

Danke nochmals für die guten Kommentare!

crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

derArb

Hallo crystal,
dann mal viel Glück.
Bei Fragen versuche ich gerne, meine Erfahrung einzubringen.
Mein Musikplayer bietet interessante Steuerungs- und Filtermöglichkeiten.
Ebenso beliebig viele Playlisten, welche aus den vorhandenen Dateien zusammengestellt und
abgespielt werden können.