Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [c#] difficoltà programma con video
Forum - C# / VB.NET - [c#] difficoltà programma con video

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 19:40
Giovedì, 18/06/2009
Questo topic è stato chiuso dal moderatore

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

PM
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 1:09
Venerdì, 19/06/2009
Testo quotato

Postato originariamente da microprocessore:
Codice sorgente - presumibilmente C# / VB.NET

  1. while (video1.Stopped=true)
  2. {
  3.  video2.Owner=pictureBox1;
  4.  video2.Play();
  5. }





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

1. La condizione del ciclo while non è valida perchè
Codice sorgente - presumibilmente Plain Text

  1. video1.Stopped=true

è un'assegnazione e non un confronto! La condizione corretta sarebbe
Codice sorgente - presumibilmente Plain Text

  1. video1.Stopped==true

. Inoltre se Stopped è di tipo bool io scriverei direttamente
Codice sorgente - presumibilmente Plain Text

  1. 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:
Codice sorgente - presumibilmente Python

  1. video1.Play(); // esegui il video
  2.  
  3. // il video e' fermo? mm... credo proprio di no!
  4. // quindi? salto alla fine del blocco del ciclo!
  5. while (video1.Stopped)
  6. {
  7.   /* ... */
  8. }
  9. // 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...


1 + 1 = 10
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:58
Venerdì, 19/06/2009
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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 15:29
Venerdì, 19/06/2009
Testo quotato


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 il 19/06/2009 alle 15:30
PM
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 1:04
Sabato, 20/06/2009
Evidentemente perchè ci sono altri errori logici. Prova a postare tutto il codice, magari qualcuno ti suggerisce la soluzione!

Ultima modifica effettuata da Shutdown il 20/06/2009 alle 15:02


1 + 1 = 10
PM
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 14:13
Sabato, 20/06/2009
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();
            }

        }
        

        
     }
  }

PM
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 15:38
Sabato, 20/06/2009
Premetto che non ho mai usato DirectX, però, pare che avessimo ragione...

Cercando in rete ho trovato:
http://www.codeproject.com/KB/directx/DirectX9_media_playb ...
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.
Codice sorgente - presumibilmente Plain Text

  1. 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...

Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using Microsoft.DirectX;
  9. using Microsoft.DirectX.AudioVideoPlayback;
  10.  
  11. namespace programma
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         //creo video
  16.         Video video1 = new Video(pathname);
  17.         Video video2 = new Video(pathname);
  18.  
  19.         public Form1()
  20.         {
  21.             InitializeComponent();
  22.             //setto video1
  23.             video1.Owner = pictureBox1;
  24.             video1.Play();
  25.             //avvio timer che controlla se video1 e' in esecuzione
  26.             timer1.Enabled = true;
  27.         }
  28.  
  29.         // ogni mezzo secondo controllo se il video e' in esecuzione
  30.         private void timer1_Tick(object sender, EventArgs e)
  31.         {
  32.             // se video1 NON e' piu' in esecuzione
  33.             if (!video1.Playing)
  34.             {
  35.                 // libero la risorsa utilizzata video1 (se vuoi)
  36.                 //video1.Dispose();
  37.                 //video1 = null;
  38.  
  39.                 // setto video2
  40.                 video2.Owner = pictureBox1;
  41.                 video2.Play(); // avvio video2
  42.  
  43.                 // e poi disabilito il timer perche' non mi serve piu':
  44.                 // ormai ho fatto partire video2
  45.                 timer1.Enabled = false;
  46.             }
  47.         }
  48.      }
  49.   }



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 il 20/06/2009 alle 15:41


1 + 1 = 10
PM
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 16:00
Sabato, 20/06/2009
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 il 20/06/2009 alle 16:06
PM
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 16:08
Sabato, 20/06/2009
Mm.. "non va" o "non succede niente" non mi pare
un ottimo indizio per capire il problema. Viene generato un
errore? Se sì, quale? Noti un malfunzionamento del
programma? Se sì, quale?

Spiega cosa accade...

Comunque.... Sì, ! è l'operatore logico NOT.
Perchè prima di usare DirectX per riprodurre i video non impari C#? ;)


1 + 1 = 10
PM
Pagine: [ 1 2 3 ] Precedente | Prossimo