VB
Realizzare un DVD Player
Prima di  realizzare il player, bisogna sapere com'è fatto un disco DVD. Trascurando gli aspetti fisici del supporto ci interessa più che altro parlare del formato DVD-Video (diverso dagli altri formati DVD) che caratterizza tutti quei dischi riproducibili sia sul PC (tramite un software di decodifica) sia sui lettori home-video casalinghi. Il file system di un DVD è differente da quello di un CD-ROM perché dispone di un layout di controllo che consente di muoversi all’interno del disco navigando nei titoli e nei capitoli. Questo proprio grazie alla struttura che li contraddistingue: un media file è formato infatti da una lista di PGC (catene di programmi), ognuna delle quali è formata a sua volta da una lista di celle che compongono l’unità fondamentale del DVD, il file VOB (video object). In  un file VOB può essere definito un grande raccoglitore dove vi si trova un po’ tutto: esso può raggiungere la dimensione limite di 1 GB ed è formato da altri file VOB più piccoli, dall’audio in formato Dolby AC3 e in diverse lingue, dal film vero e proprio in formato compresso MPEG2. Quando accediamo a un DVD usando Esplora Risorse dal nostro PC, troveremo nella root directory del disco la cartella basilare VIDEO_TS, così strutturata:

TITOLO Ogni Titolo è composto da gruppi di file caratterizzati da estensioni IFO e VOB: essi contengono il film vero e proprio. I nomi assegnati ad ogni traccia sono VTS_01_n per la prima, VTS_02_n per la seconda e così via fino a 99 (dove n è un numero che va da 0 a 9). Ognuna di queste tracce non può superare il gigabyte.
IFO, l’indice degli stream video I file con estensione IFO contengono informazioni di controllo del flusso video. Più precisamente: dato che un film è composto da più file VOB, l’IFO ne stabilisce l’ordine di esecuzione. Le informazioni binarie presenti in questi file possono venire considerate a quelle nei file EXE eseguibili comunemente utilizzati da Windows; è però opportuno sottolineare che il lettore non può accedere in alcun modo, al processore (CPU) o alla memoria RAM. Uno standard così definito prende il nome di architettura data driver ovvero guidata dai dati, proprio per le limitazioni di accesso imposte.
CAPITOLO (CHAPTER) All’interno di ogni file VTS_mm_n.VOB, sono presenti i capitoli del titolo DVD. E' grazie a loro che possiamo scorrere avanti e indietro velocemente il DVD passando da un capitolo ad un altro. Il numero massimo di capitoli  in un titolo è di 999.
PROGRAM Ogni Capitolo contiene un max. di 99 Cell o Segment che a loro volta incorpèorano i Program: questi sono l’elemento base di uno stream video. Ogni Program riporta le informazioni che indicano al lettore  quando e come le porzioni di video devono essere presentate.

L' applicazione
Cosa  serve per scrivere l’applicazione in grado di leggere un DVD-Video? Le librerie di cui avremo bisogno si trovano nelle DirectX 8.0 e in precisamente nel componente chiamato DirectShow, che rappresenta un elemento di “alto livello” poiché si appoggia alle altre DirectX come DirectSound. DirectShow fornisce un componente base chiamato DVD Navigator che facilita  le operazioni di accesso al disco e di navigazione nei capitoli del film: con questo componente è possibile progettare il nostro player totalmente indipendente e completo di ogni funzione senza dover fare riferimento alle specifiche del formato DVD, che sono  già integrate nelle librerie di Microsoft..Microsoft mette a disposizione dei programmatori l’ActiveX chiamato MsWebDVD che può essere facilmente integrato nelle applicazioni scritte in Visual Basic e addirittura nelle pagine web grazie al linguaggio script E’ importante sottolineare che DirectShow fornisce solo l’occorrente per accedere e navigare sul DVD-Video, ciò significa che se il sistema Windows in uso non dispone dei codec di decodifica del formato MPEG2, non sarà in grado di usare applicazioni DVD scritte con DirectShow (i decoder MPEG2 hardware e software sono componenti venduti separatamente e non inclusi nelle DirectX).
 

Se si modifica il concetto di buffer si può trovarne un'altra naturale applicazione: l'input e output di un file. Questo non è un forzamento, perchè la cache è sì una locazione di memoria temporanea ma può essere ricavata riservando una parte della RAM oppure usufruendo di dispositivi di memoria di massa ( Hard Disk). Infatti,  creando un file su di un disco si ottine il risultato di avere a disposizione un buffer . Si deve considerare i file come stream di dati. Java supporta sia la lettura che la scrittura di file mediante la creazione di flussi utilizzando le classi FileInputStream e FileOutputStream.

FileInputStream
Cominciamo creando l' applicazione VB inserendo dal menù Progetti il collegamento alla libreria MSWEBDVD all’interno dei Componenti del programma compariranno così nella barra degli strumenti due nuovi componenti etichettati “MSWEBDVD” e “MSDVDADM”: per il momento ci interessa solo il primo. Creiamo quindi un oggetto di tipo MSWEBDVD sul form e accanto a ci inseriamo 4 pulsanti etichettati “Play”, “Pause”, “Stop” e “Eject”. Il codice VB da assegnare a questi bottoni è molto banale ed è questo qua di seguito

Private Sub Command1_Click()
MSWebDVD1.Play
End Sub
Private Sub Command2_Click()
MSWebDVD1.Pause
End Sub
Private Sub Command3_Click()
MSWebDVD1.Stop
End Sub
Private Sub Command4_Click()
MSWebDVD1.Eject
End Sub

Risoluzione video e full-screen mode
Ora possiamosbizzarrirci nell’implementare funzioni particolari nel nostro Player. Una prima cosa da decidere è la grandezza visiva della nostra applicazione: quale risoluzione conviene usare? Non è  una risposta facile da darsi, perchè la resa dipende dal tipo di formato codificato sul DVD (anamorfico, widescreen ecc.). L’unica cosa sicura è che il controllo ActiveX di DirectShow riesce ad adattare la riproduzione alla grandezza del controllo creato: se su form è presente un oggetto MSWEBDVD 320x200, il film verrà riprodotto usando questa risoluzione. E’ questa una limitazione player che stiamo costruendo, infatti l’uso di risoluzione sbagliate spesso causa qualche difetto nella riproduzione del DVD (compaiono strane strisce verdi) e a volte errori di sistema di Windows (schermate blu, per intenderci). E’ quindi consigliabile procedere in questo modo

definire un controllo MSWEBDVD sul form nel formato standard tipo “320 x 240”;
predisporre un  tasto per passare alla riproduzione “full-screen” prevista dal controllo ActiveX;
implementare la riproduzione di ogni disco DVD nel suo formato video nativo (vanno usati i metodi GetVideoSize e SetClipVideoRect).
Per provare l’ebbrezza del “full-screen mode” basta semplicemente inserire un checkbox di Visual Basic e passare il suo stato (attivo/disattivo) al controllo MSWEBDVD prima del comando play questo il codice:

Private Sub Form_Load()
   ‘i valori di larghezza e altezza dipendono
   ‘anche dalla risoluzione video usata
   MSWebDVD1.Width = 320 * 16
   MSWebDVD1.Height = 240 * 16
End Sub
Private Sub Command1_Click()
   MSWebDVD1.FullScreenMode = Check1.Value
   MSWebDVD1.Play
End Sub
 

I controlli audio e   informazioni varie
Ecco altri esempi di cosa è possibile implementare col controllo MSWEBDVD, alcuni comandi audio come il mute e la regolazione del bilanciamento e infine una piccola routine che legge le informazioni caratteristiche del disco DVD.

...
fileF =  new File( “Prova.pan” );
fileF.delete();
...

File come Filtri
Mostriamo come usare i File per costruire un filtro sui flussi. Per fare ciò ci si appoggia a un oggetto SequenceInputStream per realizzare il buffering, usato per generare un unico input partendo da due separati.

‘Implementazione del tasto MUTE
‘bisogna creare un normale pulsante VB
Private Sub Command5_Click()
    MSWebDVD1.Mute = Not (MSWebDVD1.Mute)
End Sub
‘Implementazione della Regolazione Bilanciamento
‘bisogna creare un scrollbar orizzontale
‘con valori che variano tra –10.000 (min) e +10.000
(max)
Private Sub HScroll1_Change()
   MSWebDVD1.Balance = HScroll1.Value
End Sub
‘Legge le info del disco in uso
Private Sub Command6_Click()
   ‘Valore dell’aspectratio (1,33 per 4:3 / 1,78 per
   16:9)
   Text1.Text = Str(MSWebDVD1.AspectRatio)
   ‘Lato del disco (1 per LatoA / 2 per LatoB)
   DiscSide = MSWebDVD1.CurrentDiscSide
   If DiscSide = 1 Then
      Text2.Text = "A"
   Else: Text2.Text = "B"
   End If
   ‘Numero totale di titoli presenti sul disco
   Text3.Text = MSWebDVD1.TitlesAvailable
   ‘Lingua audio predefinita del disco
   ‘viene letto un codice nel formato LCID
   Text4.Text = MSWebDVD1.DefaultAudioLanguage
End Sub

DVD Embedding su HTML
Per concludere vediamo un saggio della potenza di MSWEBDVD e di cosa si può fare, ecco il codice Javascript da utilizzare per realizzare un dvd-player integrato su una pagina web si tratta di un lettore DVD – senza nulla da invidiare a quelli professionali - creato su una pagina HTML grazie all’embedding degli oggetti ActiveX e ai Class-ID.

<HTML>
<CENTER>
<H1> DVD Player Embedded on HTML </H1>
</CENTER>
<OBJECT CLASSID=clsid:38EE5CEE-4B62-11D3-854F-
00A0C9C898E7 ID=DVD
    STYLE="height:369px; width:740px">
<PARAM NAME="BackColor" VALUE="1048592">
<PARAM NAME="EnableResetOnStop" VALUE="-1">
<PARAM NAME="ColorKey" VALUE="1048592">
</OBJECT>
<INPUT ID=button1 NAME="button1" TYPE=
button VALUE="Play" onClick='Play();'>
<INPUT ID=button2 NAME="button2" TYPE=
button VALUE="Pause" onClick='Pause();'>
<INPUT ID=button2 NAME="button3" TYPE=
button VALUE="Stop" onClick='Stop();'>
<INPUT ID=button2 NAME="button4" TYPE=
button VALUE="Eject" onClick='Ej();'>
<SCRIPT LANGUAGE="JScript">
function Play()
{ DVD.Play(); }
function Pause()
{ DVD.Pause(); }
function Stop()
{ DVD.Stop(); }
function Ej()
{ DVD.Eject();}
</SCRIPT>
</HTML>
 

Se durante la programmazione dell’applicazione DVD con DirectShow vi dovreste imbattere in  errori di sistema (magari seguito da una schermata blu) non cè da allarmarsi, è naturale, si tratta di alcuni problemi di compatibilità riscontrati anche da me. Può dipendere dai tre parametri (DMA/Disconnetti/Sincronizza) del lettore DVD, modificabili attraverso il Pannello di Controllo di Windows, altre volte dipende che si esce dall’applicativo che usa MSWEBDVD senza inviare il comando STOP dal lettore.

Decodifica dell'MPEG-2 DirectShow è la libreria che permette di realizzare applicazioni per riprodurre i DVD-Video tuttavia richiede la presenza dei codec di decodifica per lo standard MPEG2, che vanno installati a parte. Senza questi codec, pur realizzando un’applicazione perfetta che usa DirectShow, non si riuscirà comunque a riprodurre un disco DVD.