Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
18/06/09 17:40
microprocessore
ciao, sto scrivendo un programma con c#.
vorrei che all'inizio del programma venissero riprodotti 2 video, ovviamente uno alla volta.
nello specifico vorrei che una volta terminato il primo video, parta il secondo che a differenza del primo possa essere saltato con la pressione di un tasto.
tutto questo sfruttando una pictureBox, con risoluzione 800x600.
riesco a far partire il primo video, ma non so come passare al secondo, io avevo pensato di usare:
while (video1.Stopped=true)
{
video2.Owner=pictureBox1;
video2.Play();
}
però una volta che il video termina non succede nulla.
come posso fare?

i video che ho io hanno risoluzione inferiore a 800x600 e quindi i video non occupano interamente la pictureBox, c'è un modo per estendere i video alla pictureBox?

grazie in anticipo
aaa
18/06/09 23:09
Shutdown
Postato originariamente da microprocessore:
while (video1.Stopped=true) 
{
 video2.Owner=pictureBox1;
 video2.Play();
}



Sinceramente metto molto in dubbio questo spezzone di codice...
Vediamo perchè:

1. La condizione del ciclo while non è valida perchè
video1.Stopped=true
è un'assegnazione e non un confronto! La condizione corretta sarebbe
video1.Stopped==true
. Inoltre se Stopped è di tipo bool io scriverei direttamente
while(video1.Stopped) { /* ..altro codice.. */ }
.

2. Assumendo che la condizione del tuo codice fosse scritta correttamente, io credo che risulterebbe false quindi il ciclo non verrebbe eseguito. Sicuramente fai qualcosa tipo:
video1.Play(); // esegui il video

// il video e' fermo? mm... credo proprio di no!
// quindi? salto alla fine del blocco del ciclo!
while (video1.Stopped) 
{
   /* ... */
}
// fine del blocco... continuo l'esecuzione delle altre istruzioni...


In definitiva, secondo me, dovresti sincronizzare i 2 processi... Il secondo deve attendere la fine del primo!

Ciao...
aaa
19/06/09 7:58
Il Totem
Non sarebbe meglio un Not IsPlaying? Anche se arriva alla fine potrebbe non stopparsi (azione che di solito esegue l'utente), ma sicuramente terminerebbe la riproduzione.
aaa
19/06/09 13:29
microprocessore
while (video1.Stopped=true)
{
video2.Owner=pictureBox1;
video2.Play();
}

ho sbagliato postando, ho messo ==.


ho scritto così:
while (video1.Stopped)
{
video2.Owner=pictureBox1;
video2.Play();
}

ma non succede nulla di nuovo
Ultima modifica effettuata da microprocessore 19/06/09 13:30
aaa
19/06/09 23:04
Shutdown
Evidentemente perchè ci sono altri errori logici. Prova a postare tutto il codice, magari qualcuno ti suggerisce la soluzione!
Ultima modifica effettuata da Shutdown 20/06/09 13:02
aaa
20/06/09 12:13
microprocessore
ecco il codice:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.AudioVideoPlayback;

namespace programma
{
public partial class Form1 : Form
{
//creo video
Video video1 = new Video(pathname);
Video video2 = new Video(pathname);

public Form1()
{
InitializeComponent();
//setto video
video1.Owner = pictureBox1;
video1.Play();

while (crediti.Stopped)
{
video2.Owner = pictureBox1;
video2.Play();
}

}



}
}
aaa
20/06/09 13:38
Shutdown
Premetto che non ho mai usato DirectX, però, pare che avessimo ragione...

Cercando in rete ho trovato:
codeproject.com/KB/directx/…
Ti consiglio vivamente di leggerlo tutto se vuoi venirne a capo!

L'autore mostra chiaramente l'utilizzo della programmazione a eventi per rilevare la fine del video.
video.Ending +=new EventHandler(video_Ending);


E, se non ho letto troppo superficialmente, pare che sia possibile controllare periodicamente con un Timer se il video è ancora in esecuzione (tramite Playing!!). Hai bisogno di programmare in maniera asincrona utilizzando Thread, Timer o eventi... Insomma le soluzioni pare siano diverse.

Il tuo codice non funziona perchè tu fai partire il primo video con Play() e subito dopo (parliamo di tempi brevissimi: quelli necessari al processore per passare da un'istruzione all'altra) utilizzi un ciclo (perchè usi il while?) per riprodurre il secondo video...

Sicuramente ciò che ti sto proponendo non è la soluzione più pulita, ma forse funziona...

Aggiungi un Timer e imposta così le sue proprietà:

- Enabled: False
- Interval: 500 (mezzo secondo).

Poi vediamo invece il codice...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.AudioVideoPlayback;

namespace programma
{
    public partial class Form1 : Form
    {
        //creo video
        Video video1 = new Video(pathname);
        Video video2 = new Video(pathname); 

        public Form1()
        {
            InitializeComponent();
            //setto video1
            video1.Owner = pictureBox1;
            video1.Play();
            //avvio timer che controlla se video1 e' in esecuzione
            timer1.Enabled = true;
        }

        // ogni mezzo secondo controllo se il video e' in esecuzione
        private void timer1_Tick(object sender, EventArgs e)
        {
            // se video1 NON e' piu' in esecuzione
            if (!video1.Playing)
            {
                // libero la risorsa utilizzata video1 (se vuoi)
                //video1.Dispose();
                //video1 = null;

                // setto video2
                video2.Owner = pictureBox1;
                video2.Play(); // avvio video2

                // e poi disabilito il timer perche' non mi serve piu':
                // ormai ho fatto partire video2
                timer1.Enabled = false;
            }
        }
     }
  }


Fammi sapere se almeno così funziona...
Scusa se l'ho arronzata (la risposta) ma poi a perfezionarla ci pensi tu.

Bye!
Ultima modifica effettuata da Shutdown 20/06/09 13:41
aaa
20/06/09 14:00
microprocessore
ho copiato il codice che hai postato ho aggiunto il timer con le impostazioni che mi hai suggerito... ma niente di nuovo.
ho modificato solo:
// libero la risorsa utilizzata video1 (se vuoi)
//video1.Dispose();
//video1 = null;
togliendo gli slash alle ultime 2 righe


mi sapresti spiegare perchè in if (!crediti.Playing), si mette "!": serve per negare suppongo.

dici di non aver mai usato directx, se conosci un altro modo per l'esecuzione dei video fammelo sapere, uso directx perchè sul web ho letto come riprodurre un video con directx, ma se ne conosci un altro modo lo provo.
Ultima modifica effettuata da microprocessore 20/06/09 14:06
aaa