Oppure

Loading
01/11 18:21
nightwolf
grazie mille, in parte funziona, nel senso che per vedere la copertina devo cliccare sulla listbox1, ( che contiene l intero percorso). mentre se metto il codice che mi serve ( la parte che riguarda playfile e listbox1_click nel list_canzoni) e clicco la musica nel list_canzoni mi da errore. non è possibile cliccare sulla lista che contiene solamente il nome del brano e vedere la copertina? o ce bisogno dell intero percorso?
Ultima modifica effettuata da nightwolf 01/11 18:24
aaa
02/11 1:45
Carlo
Quando passi la stringa: AxWindowsMediaPlayer1.URL = musica musica DEVE contenere l'intero percorso. Poi se il percorso è noto perché hai scelto la cartella con: FolderBrowserDialog1, è sufficiente che te lo salvi in una variabile es:

Public Class media_pleyer
    Dim numero As Integer
    Dim canzoni() As String
    Dim i As Integer
    Dim musica As String
    Dim indice As Integer
    Dim playing As Boolean
    Dim percorsoCartella as string ' una variabile pubblica in più


...
...
...

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles btn_open.Click
        AxWindowsMediaPlayer1.Visible = True
        List_canzoni.Visible = True

        FolderBrowserDialog1.ShowDialog()
        If FolderBrowserDialog1.SelectedPath = "" Then

            Exit Sub
        Else
            canzoni = System.IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath)
            percorsoCartella = FolderBrowserDialog1.SelectedPath ' nella variabile globale il percorso
        End If
        For i = 0 To canzoni.Length - 1
            ListBox1.Items.Add(canzoni(i))
            List_canzoni.Items.Add(System.IO.Path.GetFileName(canzoni(i)))
        Next

        numero = List_canzoni.Items.Count
        Label4.Text = numero
        btn_play.Enabled = True


    End Sub


...
...
...

ora quando passi l'Url puoi combinare il nome del file presente nell listBox List_canzoni con il percorso:
    Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles List_canzoni.SelectedIndexChanged
        Label2.Text = List_canzoni.SelectedIndex
        'ListBox1.SelectedIndex = List_canzoni.SelectedIndex
        'musica = ListBox1.Text
        AxWindowsMediaPlayer1.URL = Path.Combine(percorsoCartella, List_canzoni.SelectedItem)
        Timer2.Enabled = True
        lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
    End Sub

a questo punto listBox1 diventa inutile, ma ti limiti ad una sola cartella.
Ultima modifica effettuata da Carlo 02/11 1:47
in programmazione tutto è permesso
03/11 0:14
nightwolf
ok, ho eliminato la listbox1 e ho fatto le tue modifiche e il tutto funziona, nel senso che suona senza avere il percorso completo nella listbox1, ma nell esempio del player che mi hai postato, questo tizio ha creato un "playfile" x far suonare l axwindowsmediaplayer e richiamare l immagine, dimmi se sbaglio in qualcosa, io la musica la faccio suonare attraverso "AxWindowsMediaPlayer1.URL = Path.Combine(percorsoCartella, List_canzoni.SelectedItem)", perciò da quello post a me serve soltanto
Dim file As TagLib.File = TagLib.File.Create(nome) 'file per tagLib
        Dim firstPicture As TagLib.IPicture = file.Tag.Pictures.FirstOrDefault() 'prima immagine incontrata
        If firstPicture IsNot Nothing Then 'se l'immagine c'è
            Dim bin As Byte() = firstPicture.Data.Data 'array di byte dell'immagine
            PictureBox1.Image = Image.FromStream(New MemoryStream(bin)) 'immagine su pictureBox
        Else
            PictureBox1.Image = Nothing 'non c'è un'immagine nel file .mp3
        End If

ma dove lo inserisco, perchè ho provato a metterlo nella List_canzoni_Click ma niente, nella ListBox2_SelectedIndexChanged e niente,
lo so che rompo, ma non ne vengo a capo.
grazie mille
aaa
03/11 3:39
Carlo
Nell'esempio che ti ho postato ho creato la routine Playfile() che fa tutto quello che serve in modo da poterla richiamare ogni volta che si vuole eseguire un file con visualizzazione immagine.

Nel tuo programma aggiungi in coda o dove vuoi questo codice dove ho aggiunto anche la riga che aggiorna la tua label title e la partenza di timer2:
    Private Sub playFile(percorsoEnome As String)
        Me.AxWindowsMediaPlayer1.URL = percorsoEnome
        Dim file As TagLib.File = TagLib.File.Create(percorsoEnome) 'file per tagLib
        Dim firstPicture As TagLib.IPicture = file.Tag.Pictures.FirstOrDefault() 'prima immagine incontrata
        If firstPicture Is Nothing Then 'se l'immagine non c'è
            PictureBox1.Image = Nothing
        Else
            Dim bin As Byte() = firstPicture.Data.Data 'array di byte dell'immagine
            PictureBox1.Image = Image.FromStream(New MemoryStream(bin)) 'immagine su pictureBox
        End If
        lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
        Timer2.Enabled = True
End Sub


ora ogni volta che ne hai bisogno la richiami passando il pecorso completo, per esempio quando clicchi play:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_play.Click
        List_canzoni.SelectedIndex = 0
        playFile(Path.Combine(percorsoCartella, List_canzoni.SelectedItem))
End Sub


quando clicchi un file in List_canzoni:
Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles List_canzoni.SelectedIndexChanged
        Label2.Text = List_canzoni.SelectedIndex
        playFile(Path.Combine(percorsoCartella, List_canzoni.SelectedItem))
End Sub


Ricorda che per vedere l'immagine completa qualsiasi sia la sua dimensione originale, nella pictureBox puoi impostare la proprietà: SizeMode a StretchImage.

in timer1, puoi visualizzare l'ora con:
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Label7.Text = Now.ToLongTimeString
End Sub

Ultima modifica effettuata da Carlo 03/11 4:04
in programmazione tutto è permesso
03/11 10:31
nightwolf
eurecaaaaa adesso tutto funziona, grazie mille x l aiuto, ho visto che avevi messo anche la riproduzione in automatico della musica, soltanto che quando finisce una canzoni l index va alla canzone successiva ma non suona, io ho modificato la scritta così, non è giusto?
 Private Sub AxWindowsMediaPlayer1_PlayStateChange(sender As Object, e As _WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
        If CType(e.newState, WMPLib.WMPPlayState) = WMPLib.WMPPlayState.wmppsMediaEnded Then
            ' il file è terminato
            If List_canzoni.SelectedIndex = -1 Then Return 'non ci sono files selezionati
            Dim indice As Integer = List_canzoni.SelectedIndex + 1 'prossimo
            If indice > List_canzoni.Items.Count - 1 Then indice = 0 'accapo
            List_canzoni.SelectedIndex = indice 'selezione prossimo
            playFile(Path.Combine(percorsoCartella, List_canzoni.SelectedItem))
        End If

    End Sub

playfile non riproduce la musica?
aaa
03/11 12:37
Carlo
Le modifiche sembrano corrette.

Se l'indice avanza la routine viene eseguita ma quando il mediaplayer notifica che il brano è terminato, avviene in un thread diverso dal tuo form, per fare in modo che l'URL inserito attivi anche l'autoplay, l'inserimento deve essere fatto crossthread, come ho fatto nell'esempio che ti ho inviato alla routine playFile() che nel tuo caso diventa così:

    Private Sub playFile(percorsoEnome As String)
        ' chiamata crossthread, serve quando il play finisce senza intervento utente
        Me.BeginInvoke(New Action(Sub()
                              Me.AxWindowsMediaPlayer1.URL = percorsoEnome
                              lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
                          End Sub))
        Dim file As TagLib.File = TagLib.File.Create(percorsoEnome) 'file per tagLib
        Dim firstPicture As TagLib.IPicture = file.Tag.Pictures.FirstOrDefault() 'prima immagine incontrata
        If firstPicture Is Nothing Then 'se l'immagine non c'è
            PictureBox1.Image = Nothing
        Else
            Dim bin As Byte() = firstPicture.Data.Data 'array di byte dell'immagine
            PictureBox1.Image = Image.FromStream(New MemoryStream(bin)) 'immagine su pictureBox
        End If

        Timer2.Enabled = True
End Sub
Ultima modifica effettuata da Carlo 03/11 13:47
in programmazione tutto è permesso
03/11 22:27
nightwolf
mi da errore sulla lb_title.text, mi dice System.NullreferenceExceptio: riferimento a un oggetto non impostato su istanza di oggetto.
aaa
04/11 7:28
Carlo
hai spostato la riga dentro all'Invoke come ti ho mostrato?

 ' chiamata crossthread, serve quando il play finisce senza intervento utente
Me.BeginInvoke(New Action(Sub()
                      Me.AxWindowsMediaPlayer1.URL = percorsoEnome
                      lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
                  End Sub))


naturalmente nella routine playFile() fuori dall'Invoke non ci deve essere un'altra chiamata a: AxWindowsMediaPlayer1.
Se non hai cancellato la vecchia riga: lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name, stai tentando di leggere una proprietà di un oggetto (AxWindowsMediaPlayer1) istanziato su un'altro thread ed inaccessibile dal thread di Form1.
Ultima modifica effettuata da Carlo 04/11 8:44
in programmazione tutto è permesso