
microprocessore (Normal User)
Pro
    
Messaggi: 146
Iscritto: 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
|
|

Shutdown (Founder Member)
Guru
    
Messaggi: 1212
Iscritto: 10/09/2005
|
Postato originariamente da microprocessore:
Codice sorgente - presumibilmente C# / VB.NET |
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è
Codice sorgente - presumibilmente Plain Text |
è un'assegnazione e non un confronto! La condizione corretta sarebbe
Codice sorgente - presumibilmente Plain Text |
. Inoltre se Stopped è di tipo bool io scriverei direttamente
Codice sorgente - presumibilmente Plain Text |
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 |
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... |
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
|
|

microprocessore (Normal User)
Pro
    
Messaggi: 146
Iscritto: 18/06/2009
|
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 |
|

Shutdown (Founder Member)
Guru
    
Messaggi: 1212
Iscritto: 10/09/2005
|
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 |
|

microprocessore (Normal User)
Pro
    
Messaggi: 146
Iscritto: 18/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();
}
}
}
}
|
|

Shutdown (Founder Member)
Guru
    
Messaggi: 1212
Iscritto: 10/09/2005
|
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 |
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++ |
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 il 20/06/2009 alle 15:41 |
|

microprocessore (Normal User)
Pro
    
Messaggi: 146
Iscritto: 18/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 |
|

Shutdown (Founder Member)
Guru
    
Messaggi: 1212
Iscritto: 10/09/2005
|
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#?
|
|