DirectX.AudioVideoPlayback: Video-Wiedergabe auf zweitem Bildschirm: nur Ton

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von NoIde.

    DirectX.AudioVideoPlayback: Video-Wiedergabe auf zweitem Bildschirm: nur Ton

    Hallo zusammen,

    ich habe ein Problem mit einer ganz einfachen Form, mit einem Button und einer PictureBox. Ich möchte beim Drücken des Buttons in dieser Picturebox ein Video abspielen. Mit dem Code unten funktioniert das im Prinzip schon gut.

    Das Problem ist: Ich verwende auf meinem PC zwei Bildschirme (erweiterter Desktop). Ich möchte das Fenster, auf dem das Video abgespielt wird, (ausschließlich) auf meinem zweiten Bildschirm verwenden, nicht am primären Monitor.
    Aber wenn ich den Button drücke und das Video dort abspielen lasse, wird zwar der Ton wiedergegeben, jedoch das Video bleibt schwarz bzw. zeigt nur den ersten Frame.
    Das Problem ist auf anderen PCs reproduzierbar, auch als Release kompiliert.

    Habt ihr da eine Idee, woran das liegen kann? DirectX scheint ansonsten eigentlich für den Zweck ganz gut geeignet zu sein!?

    LG


    VB.NET-Quellcode

    1. Imports Microsoft.DirectX.AudioVideoPlayback
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. PlayVideo()
    4. End Sub
    5. Private Sub PlayVideo()
    6. ' file to be loaded
    7. Using video0 As New Video("C:\Temp\Video.mp4")
    8. ' where to show video
    9. video0.Owner = PictureBox1
    10. ' play
    11. video0.Play()
    12. ' wait till played
    13. Do
    14. Sleep(1)
    15. Application.DoEvents()
    16. Loop Until video0.CurrentPosition = video0.Duration
    17. video0.Dispose()
    18. End Using
    19. End Sub
    Interessanterweise habe ich gerade selbst festgestellt, dass dieses Problem (Video ohne Bild am erweiterten Bildschirm) nur bei Videos in mp4-Containern, bei H264-MPEG-4 AVC Codes auftritt. Auch wenn ich sie mit diversen Tools (Movie Maker, XMedia Recode) neu kodiere.

    wmv hingegen war kein Problem.

    Ich verwende das "LAV Filters" Codec-Paket (wird bei wmv nicht benötigt).

    Ich denke, es wäre für mich eine mögliche Lösung die Videos in wmv zu kodieren.

    Dennoch würde mich interessieren, warum das genau bei diesem Codec in Kombination mit dem erweiterten Bildschirm auftritt. Und falls jemand anders das Problem hat, hilft die Info vielleicht weiter...
    Hi,

    also ich finde die Dokumentation dazu nicht mehr. Microsoft.DirectX.AudioVideoPlayback ist auch schon veraltet, das ganze DirectX-Zeug für .net wird von MS seit Jahren nicht mehr weiterentwickelt. Ich meine mich zu erinnern, das diese Codecs funktionieren AVI, MPG, WMV, DivX, Xvid. Ich weiss zufällig das die Bass.dll in kombination mit der BASS_DSHOW mit MP4 und H264 klar kommt, das wäre eine alternative. Das nonplusultra ist die DLL nicht, aber für MP4 H264 wiedergabe ausreichend.

    un4seen.com/forum/?topic=10079.0




    Edit @saleyman

    Wie genau passiert das denn? Bei wechsel von Screen1 auf Screen2? Sind beide Monitore an der gleichen Garfikkarte angeschlossen? Kann ich mir vorstellen, das eine DeviceLost-Exception das Problem ist. Dann müsstest du evtl. das Video neu initialisieren und zur position springen, wo du im Video warst. Werden dir denn Exceptions angezeigt in der Ausgabe?

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „NoIde“ ()

    Guten Morgen,

    @Nolde: Danke für die detaillierte Antwort.

    Was wäre denn die empfohlene Variante, um Videos wiederzugeben? Windows Media Player kommt für uns nicht in Frage. Ich habe ein Software-Framework mit ein paar Applikationen, die darauf basieren und alle die gleiche Form verwenden. Das Video-Objekt wird nur bei einer Applikation auf dieser Form benötigt und die anderen sollten das gar nicht laden. Das WMP Objekt müsste bereits fix eingebunden sein, deshalb war das keine zufriedenstellende Lösung.

    Was wird denn heute empfohlen, um Videos wiederzugeben?

    Nein, das Problem tritt in jedem Fall auf: Videofenster verschieben, Videofenster halb/halb auf beiden Bildschirmen, Videofenster (Form) am erweiterten Bildschirm neu aufgebaut (frisch, oder "Clear").
    Eigentlich soll die Form ausschließlich am erweiterten Bildschirm verwendet werden. Dennoch habe ich dort nur "schwarze" Videos, aber mit Ton bekommen. Exceptions bekomme ich keine.
    Moin moin,

    Ich hab auch lange versucht was gescheites für Video-Wiedergabe zu finden, habs aufgegeben. Gibt ein VLC Plugin, das funktioniert aber nur wenn der VLC Player samt ActiveX oder COM Object installiert ist(auf dem Zielrechner). Spielt aber nahezu alles ab. Mit Windows Media Player meinste das WMP-Control?

    Also auf einfache Art, bass.dll mit bass_dshow.dll. Auf der Seite von Surodev ist die bass_dshow zwar nicht mehr auffindbar, aber der Link mit den Downloads im Un4ssen Forum ist aktuell. Wird scheinbar nicht mehr weiterentwickelt die bass_dshow. Codecs sind ein paar gängige unterstützt.

    Eine weitere Möglichkeit(theoretisch), wäre ffplay, der Player von FFMpeg. Damit könnte man Videos abspielen, das Fenster als Child der Form setzen. Hast dann aber einen weiteren Process, kann umständlich sein, müsste man schauen wie und ob man das gescheit steuern kann. So in etwa hab ich das mal mit dem OMXPlayer auf'm Raspi gemacht.

    DirectX(zum rendern) oder OpenGL und FFMpeg(zum dekodieren) zusammen täte auch gehen, aber mit VB.Net wohl nicht einfach umsetzbar, da müsste man ne DLL in C/C++ machen und einen Wrapper mit VB bauen. Oder direkt umständlich den DirectX-Part, in VB.Net nachbauen, sollte aber aufwendiger sein, als in C++ eine DLL zu machen, da wir in VB.net die ganzen Enums, Strukturen, Konstanten, Klassen nicht fertig verfügung haben, alles selbst runterschreiben müssten.

    Also eine wirklich gute und einfache Möglichkeit für alle gängigen Codecs habe ich nicht parat.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „NoIde“ ()

    Danke Nolde,
    mit DirectX.AudioVideoPlayback kann ich meine Wünsche soweit schon mal erfüllen, sodass alles läuft. Abgesehen davon, dass scheinbar nicht jeder Codec am 2. Bildschirm funktioniert.... ?(
    Ich hätte aber auch keine "offizielle" Empfehlung gefunden, wie man heutzutage Videos wiedergibt... sehr seltsam.

    Danke nochmals!!
    Hi,

    kurze Frage, wo hast du die dll

    VB.NET-Quellcode

    1. Microsoft.DirectX.AudioVideoPlayback
    her?

    Ich wollte dafür jetzt keinen neuen Thread aufmachen. Ebenso nicht von einer falschen Website herunterladen...

    Liebe Grüße
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Die ganzen DLL's sind unter diesen Pfad zu finden

    Quellcode

    1. C:\Windows\Microsoft.NET\DirectX for Managed Code

    Darin sind viele Unterordner mir verschiedenen Versionen der DLL's, verweise in deinem Projekt auf die entsprechenden DLL's und sie stehen dir im Programm zur verfügung.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin