Mehrere Mediaplayer miteinander synchronisieren

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Mehrere Mediaplayer miteinander synchronisieren

    Hallo Forum!

    Ich hab ein Prog geschrieben, in dem es mehrere AxWindowsMediaplayer Steuerelemente (sogar verteilt auf 2 Forms) gibt.
    Nun hab ich das soweit fertig.. ABER: Beim Testen mit verschiedensten Videoformaten ist mir aufgefallen, dass die Medialayer nicht synchron laufen.
    Gibt es bei NET einen Befehl, um einen Parent festzulegen und die anderen Mediaplayer als Child zu deklarieren?
    Gibt es vielleicht eine Befehlsstruktur wie bei Blitz, dass man mehrere Befehle zugleich ausführen kann. (In diesem Fall hab ich: AxWindowsMediaPlayer1.Ctlcontrols.play())
    Versucht hab ichs schon mit einer Funktion, die kurz nach drücken der Play Taste die Position der Player gleichsetzt: DirectCast(AxWindowsMediaPlayer2.Ctlcontrols, WMPLib.IWMPControls2).currentPosition = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition
    Jetzt bin ich schon eine Woche beim herumbasteln, aber geholfen hats alles nichts.
    Hätt ich wohl von Anfang an doch eher den Quicktime nehmen sollen? Oder vielleicht sogar mit DX?
    Das ganze jetzt noch umschreiben ist mir bei knapp 6k zeilen code zu anstrengend!
    Hoffe jemand kann helfen.

    ummerland
    Kann mir wirklich niemand helfen.
    Falls ich die Frage ungenau gestellt hab:
    Ich möchte doch einfach nur, dass zwei Mediaplayer Steuerelemente beim Drücken der "Play" Taste GEICHZEITIG starten und dann bei der Wiedergabe Framegenau das gleiche zeigen.
    a) Wie zur Hölle bekommt man 6k Zeilen mit der billigesten aller Methoden: Mediaplayercontrol. Da kann ich fast nur davon ausgehen, dass das so schlecht programmiert ist, dass du das so oder so neu schreiben musst.
    b) Um das wirklich gleichzeitig ablaufen zu lassen... da hat man im Forum schon oft drüber diskutiert. Meiner Meinung nach ist die einzige halbwegs einfache Möglichkeit die Streams in das gleiche Format zu konvertieren. Sprich Channel, SampleRate, BitsPerSample und WaveFormatTag sind gleich und anschließend die Samples übereinander zu legen und diesen Stream anschließend wiederzugeben. Alles andere wird nie wirklich funktionieren, da wir nunmal sehr sehr sehr kleine Unterschiede hören und du bei aufruf einer Play oder was auch immer egal bei welchem Framework immer eine minimale Rechenzeit hast um die es dann verzögert wird. Außerdem kann es auch anschließend bei den Callbacks kleine Unterschiede geben welche sich schnell summieren und du hast schon wieder nen relativ großes delay. Deshalb einzige Möglichkeit mit der man das auch in der Praxis macht -> zusammenmixen.

    Wenn du jedoch nicht wirklich sooo viel arbeit willst wird dir nix anderes übrig bleiben als ein halbwegs umfangreiches framework zu verwenden. Und NEIN das Mediaplayer control ist dafür garantiert nicht geeignet. Meiner Meinung nach sollte man das Teil so oder so verbieten. Es gibt viele AudioFrameworks such dir eines, das dir passt. Wenn du jedoch arbeit willst kannst das auch selbst machen. Jedoch sobald du Mp3 (das geht noch), Ogg, Flac,... haben willst wirds komplizierter wobei sogar resampeln sehr kompliziert werden kann.

    EDIT: gar nicht gesehen du gehst nicht nur von Audio aus von dem her musste so oder so schon fast nen framework nehmen. Jedoch frag mich nicht welches. (nie was mit video gemacht)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thefiloe“ ()

    Danke für deine Antwort thefiloe

    Naja wird mir wohl nichts anderes überbleiben. Schön langsam fang ich mich zu fragen an, warum es QuickTime und andere NICHT Microsoft Software es offenbar mit leichtigkeit schaffen, nicht aber die vom Hersteller selbst.

    Eines lass ich mir aber nicht nachsagen! Der Code ist SAUBER programmiert! (für VB-Verhältnisse)
    Hauptsächlich ist das Programm eine einfache Bedien- und Steuerlösung mit Videoausgabe für ein Hardwarepanel mit FPGA, das über den Seriellport angesteuert wird. Und da ich eher von der Hardware Programmierseite (C, Bas) komme und mir gedacht hab, mit VB bekommt man am schnellsten unkompliziert eine schöne Oberfläche hin (was auch korrekt ist), allerdings ists Codemäßig wohl doch die 2.Wahl. (Meine ehemaligen BASIC Künste ruhen in Frieden)
    Wenn ich mir die Arbeit mach, alles neu zu schreiben, dann wohl in VC++.

    Vielleicht hat jemand Erfahrung mit einem anderen Steuerelement gemacht? Evtl Quicktime oder FWork!
    Ich möchte weder eure noch meine weitere Zeit verbraten: also wenn jemand ausm Stehgreif heraus ERFAHRUNGEN hat... Bitte schreiben

    ummerland

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ummerland“ ()

    ummerland schrieb:

    Eines lass ich mir aber nicht nachsagen! Der Code ist SAUBER programmiert! (für VB-Verhältnisse)

    OK. Aber ist er auch "effizient"? Du bist vermutlich neu im .Net Framework? Das FW ist ... MÄCHTIG. Selbst alte Hasen finden immer wieder Funktionen und Methoden, die dutzende Codezeilen auf eine eindampfen können.

    zu deinem Problem:
    Schon mal System.Windows.Media.MediaPlayer angeschaut und da die .Clock Eigenschaft?
    MediaPlayer can be used in two different modes, depending on what is driving the player: independent mode or clock mode. In independent mode, the MediaPlayer is analogous to an image and the media opened through the Open method drives playback. In Clock mode, the MediaPlayer can be thought of as a target for an animation, and thus it will have corresponding Timeline and Clock entries in the Timing tree which controls playback. For more information on media modes, see the Multimedia Overview.

    Klingt für mich jetzt (ohne viel Ahnung von Multimedia zu haben, weil mich das Thema nicht reizt) irgendwie ziemlich genau nach den was du suchst. Die "Clock" ist dein "Master" und der Mediaplayer ist der Slave/Client. Und vermutlich (Versuch macht kluch) lassen sich auch mehrere MediaPlayer mit EINER Clock verbinden. Ich würde sagen, das ganze klingt vielversprechend und ist nen Versuch wert.

    EDIT:
    Ist im Prinzip NOCH einfacher ;) Zumindest bei WPF.
    Es gibt genau EINEN Player und der Rest sind nur die "Anzeigen":

    VB.NET-Quellcode

    1. Imports System.Windows.Media
    2. Class MainWindow
    3. Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
    4. Dim ofd As New Microsoft.Win32.OpenFileDialog
    5. ofd.ShowDialog()
    6. Dim f = ofd.FileName
    7. Dim p As New MediaPlayer
    8. p.Open(New Uri(f))
    9. Dim dr As New VideoDrawing With {.Rect = New Rect(0, 0, 100, 100), .Player = p}
    10. For i = 1 To 3
    11. Dim fr As New Window1
    12. fr.Background = New DrawingBrush(dr)
    13. fr.Show()
    14. Next
    15. p.Play()
    16. End Sub
    17. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    VC++ würde ich schön die Finger von lassen.
    Wenn dann C# --> ähnliche Syntax und die wohl am häufigsten benutze .net Sprache.

    Und was andere Mediaplayer im Hintergrund machen kannst du nicht wissen. Kann gut sein, dass diese auch mixen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke Picoflop

    Das sieht sehr gut aus!
    Hab das Projekt aber zu Zeit nicht bei mir, werds aber im Laufe der Woche mal ausprobieren.

    Dass das Framework MÄCHTIG ist, glaub ich sofort und ich will keinesfalls behaupten dass mein Code perfekt ist (mit allen Möglichen neuen Strukturen, Funktionen, usw). Allerdings in alter Coder - Manier: Sauber, und auf jeden Fall schnell genug für ein (nicht mehr ganz so) simples Bedienerfenster.