Internterne Musik abspielen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Yuko.

    @UltraZz Ich nehme mal an, dass Du sie als Binary Deinen Ressourcen hinzugefügt hast.
    Speichere die Datei ab und Lade sie mit Deinem Player:

    VB.NET-Quellcode

    1. IO.File.WriteAllBytes("c;\Temp\xxx.mp3", My.Ressources.xxx)
    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!
    WAV-Sounds kannst du direkt abspielen!

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. My.Computer.Audio.Play(My.Resources.Sound1)
    3. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o
    Ich empfehle dir NAudio, hat viele Funktionen und damit kann man viel machen. Du kannst dann damit MP3, Wave, AAC und noch andere Audiodateien wiedergeben.
    Das Problem an der Sache ist, man kann nicht ganz Audios von der Ressourcen abspielen (nur WAV, mehr nicht denke ich).

    Du könntest dass dann so machen:

    VB.NET-Quellcode

    1. Private m As NAudio.Wave.Mp3FileReader = Nothing 'MP3 file reader
    2. Private wo As NAudio.Wave.WaveOut = Nothing 'Audioabspieler
    3. Public Sub CopyAudioToLocalAppdata()
    4. IO.File.WriteAllBytes(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\TempMusic.mp3", My.Resources.Mp3File)
    5. 'Kopiere die Audiodatei in der Localappdata-Directory
    6. End Sub
    7. Public Sub Init(file As String)
    8. mp3 = New NAudio.Wave.Mp3FileReader(file) ' Initialisiere Mp3FileReader für das Lesen der Audiodatei
    9. wo = New NAudio.Wave.WaveOut
    10. wo.Init(m) ' Initialisiere WaveOut für das Abspielen von der Audiodatei
    11. End Sub
    12. Public Sub PlayAudio()
    13. wo.Play() ' Spielt die Audiodatei ab
    14. wo.Volume = 1.0 'Volume-Einstellung
    15. End Sub
    16. Public Sub StopAudio()
    17. wo.Stop() ' Stoppt die Wiedergabe
    18. m.Position = 0 ' Setzt die Audioposition auf 0
    19. End Sub

    Falls der Thread noch gebraucht wird, es gibt doch eine Möglichkeit, mit NAudio interne Musik abzuspielen.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. PlayMusic(My.Resources.Musik1) ' Spielt die Musik von den Ressourcen ab (Musik1 ist die Musikdatei)
    3. End Sub
    4. Private Sub PlayMusic(music As Byte())
    5. Dim mp3 As New NAudio.Wave.Mp3FileReader(New IO.MemoryStream(music)) ' Initialisiert den MP3-Reader und den MemoryStream wo die Musikdatei reingeladen wird (bytes)
    6. Dim wo As New NAudio.Wave.WaveOut() ' Initialisiere WaveOut für das abspielen
    7. wo.Init(mp3) ' Initialisiere nochmals WaveOut für den MP3-Reader zum abspielen
    8. wo.Volume = 0.5
    9. wo.Play()
    10. End Sub
    @Yuko Das riecht sehr nach MemoryLeak.
    Finde mal heraus, was von MemoryStream, Mp3FileReader und WaveOut nach Gebrauch disposed werden muss.
    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!
    [spoiler][/spoiler]@RodFromGermany
    Hab es getestet, soweit bei mir ist kein Memoryleak zu finden. Den Memorystream kann man ja auch optional disposen, WaveOut/Mp3FileReader nicht wenn man es noch gebrauchen will. EDIT: Memoryleak passiert da aber nur wenn man den Musikstream mehrmals abspielt (und initialisiert), bringt aber nix da die Musik nochmals abgespielt wird (mit den anderen auch im Hintergrund), man kann die Musik auch in einen Loop versetzen, so dass nicht nochmehr MemoryStreams erstellt werden.

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

    Yuko schrieb:

    optional disposen
    gibt es nicht.
    Entweder Du disposest diese Instanz oder es staut sich nicht freigegebener Speicher an, ein Memoryleak, weil es sich hier um unmanaged Speicher handelt.
    Du wirst es erst merken, wenn Du es 1000 Mal ausgeführt hast.
    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!
    @Yuko Wenn nman es nicht mehr braucht ...
    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!