Windows Media Player spielt bloss das erste Video in Fullscreen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Windows Media Player spielt bloss das erste Video in Fullscreen

    Mahlzeit zusammen,

    ich hab ein kleines Problem mit der Darstellung von mehreren Videos in Folge. Und zwar wird immer nur das erste Video im Vollbildmodus gezeigt...

    Ich rufe eine Methode Uhr() auf, die dann das Video spielt. Wenn das Video zu Ende ist, rufe ich diese Methode erneut ab, mittels:

    VB.NET-Quellcode

    1. Private Sub AxWindowsMediaPlayer1_PlayStateChange(sender As Object, e As _WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
    2. If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then
    3. Uhr()
    4. End If
    5. End Sub


    Diese nimmt sich aus einer ListBox dann den nächsten Dateinamen. Ich habe im Internet folgenden Code gefunden, den ich aber nicht verstehe (v.a. das Application.DoEvents()):

    VB.NET-Quellcode

    1. Do While AxWindowsMediaPlayer1.playState <> WMPLib.WMPPlayState.wmppsPlaying
    2. Application.DoEvents()
    3. Loop
    4. AxWindowsMediaPlayer1.fullScreen = True


    Diesen Code hab ich in Uhr() gepackt und es hat erst einmal noch funktioniert. Doch dann hab ich an anderer Stelle den Code verändert und jetzt funktioniert es nicht mehr.

    Kann man vielleicht jemand helfen den Code zu verstehen, ich glaube er ist einfach an der falschen Stelle im Programm...

    kafffee schrieb:

    Doch dann hab ich an anderer Stelle den Code verändert
    Was ganz genau soll denn Dein zweites Snippet tun?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    kafffee schrieb:

    Snippet
    Das untere Quellcode-Schnipsel (Snippet) mit den Zeilen 1 bis 4.
    Dann solltest Du mal den kompletten Code posten.
    Zippen ohne die bin- und obj-Verzeichnisse, Erweiterte Antwort => Dateianhänge => Hochladen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Eh voila:

    Die Codezeilen die ich erwähnt hab findest du in Form2 auf Zeile 74-77

    Wenn du noch Fragen hast melde dich kurz
    Dateien
    • SlideShow.zip

      (1,59 MB, 57 mal heruntergeladen, zuletzt: )

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

    @kafffee Bei mir hat das tadellos funktioniert.
    Die Projektdatei ist etwas verquer bezüglich Form2.
    Den Eintrag Form2 löschen und wieder neu hinzufügen.
    Und:
    Klassen werden umbenannt, indem im Projektmappen-Explorer die Datei umbenannt wird (Form1 <=> Startbildschirm).
    Ansonsten solltest Du Dir noch mal die Instanziierung von Dialogen befassen:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    ====
    Und:
    in PictureBox1_Click():

    VB.NET-Quellcode

    1. Timer1.Enabled = Not Timer1.Enabled


    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

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

    @RodFromGermany
    Was meinst du mit verquer? Bloß den Name von Form2 verändern?

    Kann es sein dass deine Videos sowieso schon full screen sind weil sie die entsprechende Auflösung haben? Ich hab da nämlich so einen Ordner mit Handyvideos aus dem Jahre 2006 und da wird immer nur das zuallererst abgespielte in Vollbild angezeigt, alle weiteren werden nicht hoch skaliert bzw. werden in Originalgrösse abgespielt
    Deine Form2 war als Link in die Projektmappe integriert, kann sein, dass Du eine Datei|Klasse bearbeitest und eine andere Datei|Klasse ausführst.

    kafffee schrieb:

    mit Handyvideos aus dem Jahre 2006
    OK, kann sein, dass die nicht die erforderliche Auflösung haben.
    Umbenennen von Dateien UND Klassen GEMEINSAM geht so:

    Ich hab mir mal Deine Klassen leicht überarbeitet:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic
    2. Public Class Startbildschirm
    3. Public Array As New List(Of String)
    4. Private _rnd As New Random()
    5. Private MyForm2 As Form2
    6. Private Sub Startbildschirm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. TableLayoutPanel1.Left = (Me.Width - TableLayoutPanel1.Width) \ 2
    8. TableLayoutPanel1.Top = (Me.Height - TableLayoutPanel1.Height) \ 2
    9. End Sub
    10. Private Sub btnBeenden_Click(sender As Object, e As EventArgs) Handles btnBeenden.Click
    11. Me.Close()
    12. End Sub
    13. Private Sub btnOrdnerauswahl_Click(sender As Object, e As EventArgs) Handles btnOrdnerauswahl.Click
    14. If Not String.IsNullOrEmpty(txtPfad.Text) Then
    15. ' da starten, wo wir eben aufgehört haben
    16. FolderBrowserDialog1.SelectedPath = txtPfad.Text
    17. End If
    18. FolderBrowserDialog1.ShowDialog()
    19. txtPfad.Text = FolderBrowserDialog1.SelectedPath
    20. End Sub
    21. Private Sub btnDiaStarten_Click(sender As Object, e As EventArgs) Handles btnDiaStarten.Click
    22. If Not IO.Directory.Exists(txtPfad.Text) Then
    23. MessageBox.Show("Ungültiger Ordner!")
    24. Return
    25. End If
    26. Dim searchType = FileIO.SearchOption.SearchTopLevelOnly
    27. If chkUnterordner.Checked = True Then
    28. searchType = FileIO.SearchOption.SearchAllSubDirectories
    29. End If
    30. For Each foundFile As String In My.Computer.FileSystem.GetFiles(txtPfad.Text, searchType, "*.jpg", "*.jpeg", "*.gif", "*.wmf", "*.png", "*.bmp", "*.mp4", "*.avi")
    31. ListBox1.Items.Add(foundFile)
    32. Array.Add(foundFile)
    33. Next
    34. Array = Array.OrderBy(Function() _rnd.Next()).ToList()
    35. ListBox2.DataSource = Array
    36. MyForm2 = New Form2
    37. MyForm2.MyStartbildschirm = Me
    38. MyForm2.Show()
    39. End Sub
    40. Private Sub chkTimer_CheckedChanged(sender As Object, e As EventArgs) Handles chkTimer.CheckedChanged
    41. numSekundenzahl.Enabled = chkTimer.Checked
    42. End Sub
    43. Private Sub btnBeenden_MouseHover(sender As Object, e As EventArgs) Handles btnBeenden.MouseHover, txtPfad.MouseHover,
    44. btnDiaStarten.MouseHover, chkUnterordner.MouseHover, btnOrdnerauswahl.MouseHover
    45. Dim ctrl = CType(sender, Control)
    46. ctrl.BackColor = Color.FromArgb(142, 187, 242)
    47. End Sub
    48. Private Sub btnDiaStarten_MouseLeave(sender As Object, e As EventArgs) Handles btnBeenden.MouseLeave, txtPfad.MouseLeave,
    49. btnDiaStarten.MouseLeave, chkUnterordner.MouseLeave, btnOrdnerauswahl.MouseLeave
    50. Dim ctrl = CType(sender, Control)
    51. ctrl.BackColor = Color.Yellow
    52. End Sub
    53. End Class

    VB.NET-Quellcode

    1. Imports AxWMPLib
    2. Public Class Form2
    3. Public MyStartbildschirm As Startbildschirm
    4. Public Zaehler As Integer
    5. Public VideoRunning As Boolean
    6. Public Function AutoSizeImage(ByVal bmp As Image,
    7. ByVal maxWidth As Integer,
    8. ByVal maxHeight As Integer,
    9. Optional ByVal bStretch As Boolean = False) As Image
    10. ' Größenverhältnis der max. Dimension
    11. Dim maxRatio As Single = CSng(maxWidth / maxHeight)
    12. ' Bildgröße und aktuelles Größenverhältnis
    13. Dim imgWidth As Integer = bmp.Width
    14. Dim imgHeight As Integer = bmp.Height
    15. Dim imgRatio As Single = CSng(imgWidth / imgHeight)
    16. ' Bild anpassen?
    17. If (Not (imgWidth > maxWidth Or imgHeight > maxHeight) Or bStretch) Then
    18. ' unverändertes Originalbild zurückgeben
    19. Return bmp
    20. End If
    21. If imgRatio <= maxRatio Then
    22. ' Größenverhältnis des Bildes ist kleiner als die
    23. ' maximale Größe, in der das Bild angezeigt werden kann.
    24. ' In diesem Fall muss die Bildbreite angepasst werden.
    25. imgWidth = CInt(imgWidth / (imgHeight / maxHeight))
    26. imgHeight = maxHeight
    27. Else
    28. ' Größenverhältnis des Bildes ist größer als die
    29. ' maximale Größe, in der das Bild angezeigt werden kann.
    30. ' In diesem Fall muss die Bildhöhe angepasst werden.
    31. imgHeight = CInt(imgHeight / (imgWidth / maxWidth))
    32. imgWidth = maxWidth
    33. End If
    34. ' Bitmap-Objekt in der neuen Größe erstellen
    35. Dim bmp2 As New Bitmap(imgWidth, imgHeight)
    36. ' Bild interpolieren, damit die Qualität erhalten bleibt
    37. Using g As Graphics = Graphics.FromImage(bmp2)
    38. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    39. g.DrawImage(bmp, New Rectangle(0, 0, imgWidth, imgHeight))
    40. End Using
    41. ' neues Bitmap zurückgeben
    42. Return bmp2
    43. End Function
    44. Public Sub Uhr()
    45. If MyStartbildschirm.ListBox1.Items.Count = 0 Then
    46. MessageBox.Show("Im ausgewählten Ordner sind keine unterstützten Dateien!")
    47. Me.Hide()
    48. MyStartbildschirm.Show()
    49. Return
    50. End If
    51. Me.Focus()
    52. Me.Timer1.Stop()
    53. If MyStartbildschirm.ListBox2.Items(Zaehler).ToString().ToLower().EndsWith(".avi") OrElse
    54. MyStartbildschirm.ListBox2.Items(Zaehler).ToString().ToLower().EndsWith(".mp4") OrElse
    55. MyStartbildschirm.ListBox1.Items(Zaehler).ToString().ToLower().EndsWith(".avi") OrElse
    56. MyStartbildschirm.ListBox1.Items(Zaehler).ToString().ToLower().EndsWith(".mp4") Then
    57. PictureBox1.Enabled = False
    58. PictureBox1.Visible = False
    59. AxWindowsMediaPlayer1.Visible = True
    60. AxWindowsMediaPlayer1.Enabled = True
    61. AxWindowsMediaPlayer1.Dock = DockStyle.Bottom Or DockStyle.Left Or DockStyle.Right Or DockStyle.Top
    62. Dim file As String
    63. If MyStartbildschirm.chkZufall.Checked = True Then
    64. file = MyStartbildschirm.ListBox2.Items(Zaehler).ToString()
    65. Else
    66. file = MyStartbildschirm.ListBox1.Items(Zaehler).ToString()
    67. End If
    68. AxWindowsMediaPlayer1.URL = file
    69. Do While AxWindowsMediaPlayer1.playState <> WMPLib.WMPPlayState.wmppsPlaying
    70. Application.DoEvents()
    71. Loop
    72. AxWindowsMediaPlayer1.fullScreen = True
    73. Else
    74. AxWindowsMediaPlayer1.Enabled = False
    75. AxWindowsMediaPlayer1.Visible = False
    76. Timer1.Interval = CInt(MyStartbildschirm.numSekundenzahl.Value * 1000)
    77. Timer1.Enabled = True
    78. PictureBox1.Visible = True
    79. PictureBox1.Enabled = True
    80. Me.PictureBox1.Dock = DockStyle.Bottom Or DockStyle.Left Or DockStyle.Right Or DockStyle.Top
    81. ' Bild laden
    82. Try
    83. Dim file As String
    84. If MyStartbildschirm.chkTimer.Checked Then
    85. file = MyStartbildschirm.ListBox2.Items(Zaehler).ToString()
    86. Else
    87. file = MyStartbildschirm.ListBox1.Items(Zaehler).ToString()
    88. End If
    89. Using Stream = New System.IO.FileStream(file, IO.FileMode.Open)
    90. Dim BMP = New Bitmap(Stream)
    91. With PictureBox1
    92. If PictureBox1.Image IsNot Nothing Then
    93. ' altes Bild zerstören
    94. PictureBox1.Image.Dispose()
    95. End If
    96. ' Bild anpassen an PictureBox
    97. ' und neues Bild zuweisen
    98. .Image = AutoSizeImage(BMP, .ClientRectangle.Width, .ClientRectangle.Height)
    99. End With
    100. End Using
    101. Catch ex As Exception
    102. MessageBox.Show("Datei konnte nicht geöffnet werden! Fehlermeldung: " & ex.Message)
    103. End Try
    104. Timer1.Start()
    105. End If
    106. If Zaehler = MyStartbildschirm.ListBox2.Items.Count - 1 Then
    107. Zaehler = 0
    108. Else
    109. Zaehler += 1
    110. End If
    111. End Sub
    112. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    113. VideoRunning = False
    114. Zaehler = 0
    115. 'PictureBox1.Left = Me.Width / 2 - PictureBox1.Width / 2
    116. 'PictureBox1.Top = Me.Height / 2 - PictureBox1.Height / 2
    117. Timer1.Interval = CInt(MyStartbildschirm.numSekundenzahl.Value * 1000)
    118. MessageBox.Show("SPACE: nächstes Bild/Video" & Environment.NewLine & "KLICK: pausieren" & Environment.NewLine & "ESC: beenden")
    119. Uhr()
    120. End Sub
    121. Private Sub Form2_Click(sender As Object, e As EventArgs) Handles Me.Click
    122. Me.Hide()
    123. End Sub
    124. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    125. Uhr()
    126. End Sub
    127. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    128. ' nur bei Bildern aktiv
    129. Timer1.Enabled = Not Timer1.Enabled
    130. End Sub
    131. Private Sub AxWindowsMediaPlayer1_PlayStateChange(sender As Object, e As _WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
    132. If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then
    133. Timer1.Start()
    134. End If
    135. End Sub
    136. Private Sub Form2_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    137. If e.KeyCode = Keys.Escape Then
    138. Timer1.Stop()
    139. AxWindowsMediaPlayer1.Ctlcontrols.pause()
    140. Me.Hide()
    141. MyStartbildschirm.ListBox2.DataSource = New String() {}
    142. 'MyStartbildschirm.ListBox2.Refresh()
    143. MyStartbildschirm.ListBox1.Items.Clear()
    144. MyStartbildschirm.Show()
    145. ElseIf e.KeyCode = Keys.Space Then
    146. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    147. Uhr()
    148. End If
    149. End Sub
    150. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    OK. Dumme Frage: Und wie ist der Unterschied dazu, dass ich einfach die Name-Eigenschaft von Form2 ändere?

    Meine Videos sind alle mit dem gleichen Handy gemacht worden und haben die gleiche Größe/Auflösung.. Und wie gesagt das erste das abgespielt wird wird immer hochskaliert, die anderen nicht...

    kafffee schrieb:

    Und wie ist der Unterschied dazu, dass ich einfach die Name-Eigenschaft von Form2 ändere?
    Allgemeine Coding-Regeln:
    Der Name einer Klasse und der Name der Datei, die diese Klasse enthält, sollten identisch sein, das hilft z.B. sehr bei der Suche.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    OK, kann sein, dass die nicht die erforderliche Auflösung haben.


    Dann muss ich damit wohl leben :( Obwohl wie gesagt immer das erste, das gespielt wird, wird trotz niedriger Auflösung im Vollbild angezeigt.

    Noch ne andere Frage. Beim Wiedergeben von Fotos empfängt meine Form KeyDown Events. Ich habs so programmiert, dass bei ESC wieder der Startbildschirm angezeigt wird, und bei SPACE das nächste Bild. Das funktioniert bei den Videos nicht. PictureBox und Windows Media Player sind dabei übereinander auf der Form platziert, und wenn Fotos angezeigt werden mach ich AxWindowsMediapLayer.Visible = False und PIctureBox.Visible = True und dementsprechend umgekehrt.
    Form2.Focus() geht nicht, hab ich schon probiert...

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

    kafffee schrieb:

    Das funktioniert bei den Videos nicht.
    Deine Video-Wiedergabe ist auch nicht richtig programmiert (die DoEvents()-Schleife), Du müsstest die Videos asynchron abspielen und auf das Play-Ende-Event warten.
    Währenddessen kannst Du die Tasten abfragen und darauf reagieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee Windows ist ein Multi-Tasking-Betriebssystem, gleichzeitig können unteerschiedliche Prozesse echt parallel auf den einzelnen Prozessorkernen ablaufen, andere wiederum laufen quasi-parallel in unterschiedlichen Zeitscheiben zeitlich gestückelt nacheinander auf einem Prozessor ab.
    So kann quasi gleichzeitig unheimlich viel parallel abgearbeitet werden. Diese Dinger, die da (quasi) parallel abgearbeitet werden, laufen in einem sogenannten Thread ab.
    Ein einfaches WinForm-Programm läuft in einem einzigen Thread, dem GUI-Thread.
    Wenn Du in einer Button_Click eine langwierige Berechnung machst oder eben ein Video ablaufen lässt (den "Prozess"), ist der Rest des Programms und insbesondere der GUI geblockt, Du kannst das Programm so lange nicht bedienen, solange der Prozess läuft.
    Um das Programm weiterhin bedienen zu können, lagert man den Prozess in einen anderen Thread aus und schon kann die GUI wieder bedient werden.
    Wenn Du nun die GUI beendest, läuft im Allgemeinen der angestoßene Thread noch weiter, das siehst Du daran, wenn Du das ganze in der Entwicklungsumgebung machst, dass zwar die GUI weg ist, jedoch das Studio noch im Run-Mode ist. Deshalb ist es wichtig, bei Programmbeendigung und so den anderen Thread sauber zu beenden.
    Wichtig: Ein Thread sollte sich stets selbst beenden, von außen geht das, indem dem Thread z.B. durch ein Flag gesagt wird, dass er sich beenden soll (er muss dazu lediglich die "Thread-Prozedur" verlassen).
    Es geht auch mit der Holözhammer-Methode, indem der Thread "abgeschossen" wird.
    Wenn Du Dein Video in einem Thread laufen lassen willst, also "nebenläufig" oder "asynchron", musst Du es asynchron starten, dazu sollte es eine Methode RunVideoAsync() oder so geben, da musst Du mal nachsehen, was Dir die IDE anbietet.
    In diesem Fall musst Du noch das RunReady-Event (so etwas in der Art) abbonieren, dann kannst Du in dieser Routine das nächste Video starten oder nicht.
    Außerdem sollte es da noch so was geben wie StopAsync(), dass Du das Video anhalten kannst.
    Dazu siehst Du Dir die Methoden an, die der VideoPlayer so anbietet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!