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:
...
...
...
...
...
...
ora quando passi l'Url puoi combinare il nome del file presente nell listBox List_canzoni con il percorso:
a questo punto listBox1 diventa inutile, ma ti limiti ad una sola cartella.
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
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
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:
ora ogni volta che ne hai bisogno la richiami passando il pecorso completo, per esempio quando clicchi play:
quando clicchi un file in List_canzoni:
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:
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?
playfile non riproduce la musica?
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ì:
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?
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.
' 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