Newsgroup: it.comp.programmare.win32
Titolo: windows media player 9

buondì newz!
vorrei fare un programmino, nel quale due video devono essere
sincronizzati. Vi spiego: è per una scuola di musica, dove insegnano
chitarra. Ho due file, uno per il video della mano dx, un per quella
sx.
io ho creato due componenti windowsmediaplayer e poi fatto:
[ho usato vb]
w1.URL = "d:\v1.wmv"
w2.URL = "d:\v2.wmv"
w1.Controls.play
w2.Controls.play
però non risulta sincronizzato, penso perchè
1 - w1.URL = "d:\v1.wmv"
2 - w2.URL = "d:\v2.wmv"
3 - w1.Controls.play
4  -w2.Controls.play
1) inizia a caricare w1
2) inizia a caricare w2
3) finito con w1, play w1, w2 si sta ancora caricando!
4) finito w2,play
penso sia per questo. ho notato che c'è una proprietà Status,
quindi penso che ci sia un metodo per capire se il file è pronto,
quindi fare il play allo stesso istante..
che ne dite?
thx a tutti, fin da ora, Augusto

 istante..
Hai ragione in parte e, anche se tu aspettassi il
verificarsi dei necessari eventi in modo da mantenere
coerenti gli stati dei 2 players, non riusciresti
probabilmente mai a sincronizzare perfettamente i due
filmati. Il motivo e` che i 2 players userebbero 2 diversi
clocks di riferimento e, a causa della natura non
deterministica del multitasking, finirebbero con il
desincronizzarsi progressivamente.
WMP internamente usa una tecnologia chiamata DirectShow che
e` parte di DirectX v7.0a+. Puoi usare direttamente
DirectShow in VB in modo altrettano (o addirittura piu`)
semplice che WMP. Il vantaggio e` che DirectShow e` molto
piu` potente di WMP e, ad esempio, ti permette di fare il
play di un numero arbitrario di files in un unico grafo e
quindi con un unico clock e DirectShow si preoccupera` di
mantenerli sincronizzati. La documentazione on-line e` qui:
http://msdn.microsoft.com/library/en-us/directx9_c/directX/htm/usingdirectshowwithvisualbasic.asp
Inoltre questa documentazione con esempi e` presente
nell'appendice alla sezione su DirectShow della
documentazione del DirectX 9 SDK per il C++.
L'approccio sicuramente funziona in C/C++. La libreria per
VB e` molto piu` limitata di quella per il C/C++ ma ha tutti
i metodi che servono a te: in sostanza dei solo chiamare 2
volte il metodo RenderFile().
-- 
/**
 * Alessandro Angeli
 *
 * MVP :: Digital Media
 */

> il file è pronto, quindi fare il play allo stesso


 vado a provare..
Se hai la versione 8 dell'SDK, sei a posto. Se hai la 7, a
seconda della release, DirectShow potrebbe essere assente,
nel qual caso basta che scarichi la versione 9 dal sito
MSDN.


ho la 8.
ho fatto il lavoro, però sai cosa succede?
quando insalli l'sdk devo installare sia quello per vb sia quello per
vc perchè nella guida di vb, la sezione di DirectShow non c'è.
Non chiedermi come mai!
morale: uso dal vb guardando la guida di c. Il problema è che le
proprietà e i metodi per vb/vc sono diversi, e anche se ci sono,
non appaiono direttamente nel menù quando si fa "oggetto." 
Va beh, piccolo inconveniente...
Poi alrta cosa: sebbene io faccia due oggetti, due Renderfile,
poi devo chiamarli con due .Run diversi. Sebbene sul mio pc
vada tutto perfetto, ho provato con pc più datati, e c'è ancora
il prob della sincronia.. cmq ho trovato la soluzione.
Grazie mille, Augusto


 il prob della sincronia.. cmq ho trovato la soluzione.
Fammi capire, chiami RenderFile() 2 volte su un singolo
oggetto FGM o crei 2 oggetti FGM? Devi creare un singolo
oggetto FGM se vuoi che il playback sia sincronizzato.


eccomi.. non ho ben capito cosa intendi per oggetti FGM.
In verità non è che abbia letto tutto o cominciato a studiare come 
funziona directshow..
ho installato directx8. Poi si creano degli esempi, sia in c che in
vb. ok, nella parte di vb alla sezione directshow c'è un programmino
di esempio che si chiama "Simple player".
io ho modificato un po' quest'ultimo. Nella sezione di dichiarazione
ci sono queste dichiarazioni di var:
*******************************************************
Private m_objBasicAudio1  As IBasicAudio        'Basic Audio Object
Private m_objBasicAudio2  As IBasicAudio        'el audio del 2nd file
Private m_objBasicVideo As IBasicVideo           'Basic Video Object
Private m_objMediaEvent1 As IMediaEvent        'MediaEvent Object
Private m_objMediaEvent2 As IMediaEvent        'MediaEvent Object
Private m_objVideoWindow1 As IVideoWindow       'VideoWindow Object
Private m_objVideoWindow2 As IVideoWindow       
Private m_objMediaControl1 As IMediaControl      'MediaControl Object
Private m_objMediaControl2 As IMediaControl      'mio..
Private m_objMediaPosition1 As IMediaPosition    'MediaPosition Object
Private m_objMediaPosition2 As IMediaPosition    'MediaPosition Object
*******************************************************
come vedi ho duplicato il tutto. poi il renderfile lo chiamo due volte
così
m_objMediaControl1.RenderFile(m_bstrFileName1)
m_objMediaControl2.RenderFile(m_bstrFileName2)
anche a me sembra che così non possono essere sincronizzati essendo
due oggetti diversi, ma visto che directshow è più veloce del
mediaplayer non ho più i problemi di prima. Tu come mi dici di fare?
Nn avresti un piccolo esempietto? [pleeese] :)
Grazie mille+mille, Augusto


Il mio VB non e` molto fluido, quindi ignora gli errori:
-----------------------------------
Dim g_objMC as IMediaControl
Set g_objMC = New FilgraphManager
g_objMC.RenderFile file1
g_objMC.RenderFile file2
g_objMC.Run
' fai quello devi per aspettare
' la fine del playback
-----------------------------------
Questo ti apre 2 finestre. Siccome con IBasicVideo del
FilgraphManager puoi gestire solo una finestra, devi usare
IBasicVideo dei video renderers. In VB non sono sicuro che
sia fattibile, ma si fa cosi`:
- itera sugli elementi di FilgraphManager.FilterCollection
- cerca i 2 elementi che corrispondono ai video renderers
(quelli il cui nome e` "Video Renderer XXXX" credo, in C/C++
si farebbe diversamente e non so replicarlo in VB)
- ottieni IVideoWindow da IFilterInfo.Filter (leggi la
documentazione di IVideoWindow per il C++ perche' devi fare
alcune cose se usi IVideoWindow direttamente sul filtro)
Meglio ancora, cerca gli unici 2 elementi che supportano
IVideoWindow (per gli elementi su cui non e` supportata,
dovrebbe essere generato un errore - E_NOINTERFACE per la
precisione - ma non ho idea di come si gestisca in VB)
Augusto wrote:

-- 


ok, domani sera ci provo. Ho un esame di architetture domani in
universitą... grazie di nuovo. Ti faccio sapere cosa riesco a fare.
Augusto