Rieccomi qua cari forumanti!
Sono sempre il solito pazzoide in cerca di commenti ad uno dei suoi tentativi più strampalati, ovvero la scrittura di un programma Basic che riesca a riprodurre filmati partendo da immagini bitmap, ciascuna delle quali rappresenta un singolo fotogramma del filmato. Per iniziare mi serviva un software che prendesse un filmato di qualunque formato e lo scomponesse in tutti i fotogrammi che lo formano, così dopo una tutto sommato breve ricerca ho trovato
questo, che oltre alla semplicità di utilizzo unisce anche la possibilità caricare video di molti formati diversi e di salvare i fotogrammi in altrettanti formati immagine, tra cui appunto il bitmap che era quello che mi interessava. L'unico problema era che nella versione free imponeva una fastidiosa scritta in sovrimpressione che rovinava di fatto i fotogrammi. Non essendoci altra via dunque ho deciso di acquistare la licenza (abbastanza caruccia oltretutto, 35 € comprese spese e tasse) ma almeno ho avuto quello di cui avevo bisogno.
Non sapendo con quale filmato iniziare la sperimentazione ho scelto un video scaricato da youtube che è la sigla iniziale del telefilm "Medium" del quale sono appassionato.
Detto fatto, ho convertito il video in formato quicktime (estensione
.mov) e l'ho caricato nel programma, che lo ha suddiviso in 1080 fotogrammi bitmap da 100x75 pixel ciascuno. Le piccole dimensioni sono state necessarie in quanto il Basic non è molto veloce e la riproduzione di video a dimensioni maggiori, una volta terminato il programma, sarebbe stata decisamente troppo lenta.
Il problema successivo consisteva nel fatto che le immagini-fotogramma venivano salvate col nome "medium" seguito dal numero progressivo dell'immagine e ovviamente dall'estensione .bmp. Per l'estensione non c'era problema ma per la parola "medium" sorgevano alcune difficoltà, legate soprattutto alla parte del programma adibita alla ricerca e rilevamento del numero del file, così dopo un'altra attenta ricerca ho trovato
quest'altro programma, specializzato nella rinomina seriale di migliaia di file in breve tempo, così una volta impostate correttamente le opzioni ho tolto da tutti i files la parola "medium" facendo in modo di lasciare solo il numero progressivo.
Successivamente ho estrapolato un pezzo di codice che avevo già trattato nel thread "Visualizzazione bitmap tramite Basic", l'ho adattato allo scopo e ho aggiunto le righe necessarie all'apertura delle immagini-fotogramma in sequenza. Purtroppo ancora non ho imparato a gestire la memoria con sufficiente sicurezza e non sono riuscito a creare una sezione che aprisse più di un'immagine alla volta (benchè in teoria sarebbe benissimo possibile aprire e tenere aperti molti file allo stesso tempo) così il programma si limita ad aprire un file alla volta, visualizzarlo sullo schermo, poi chiuderlo ed aprire quello successivo. Questa operazione di continua apertura e chiusura ovviamente rallenta molto la riproduzione, ma il piccolo formato del video riesce a compensare il difetto e la riproduzione è abbastanza veloce.
A questo punto però sorge un altro problema. Le immagini bitmap salvate dal programma di scomposizione in fotogrammi sono a 24 bit (true-color), quindi i colori riproducibili sono 16 milioni e rotti, mentre invece il Basic può riprodurne solo 16 nello stesso tempo, in realtà sarebbe possibile arrivare fino a 256 modificando i livelli di intensità tramite la porta 3C8 (&H3C8 nel Basic) ma non farebbe altro che modificare sempre e comunque solo i 16 colori già prima disponibili.
Il vero intento comunque al momento era verificare se il Basic e, per esteso, la sua velocità di elaborazione erano sufficienti ad ottenere una riproduzione del filmato accettabile, quindi anche se i colori e l'immagine non erano fedeli all'originale non importava. Quindi ho lasciato il listato com'era e l'ho fatto girare, ebbene, funzionava!
Sono riuscito ad abbozzare un programma in grado di visualizzare filmati partendo da fotogrammi raster, esattamente come farebbe un proiettore con una pellicola, una specie di "proiettore per pc" insomma!
Questo è il listato sperimentale originale che ho scritto come inizio delle prove:
CODICE
TYPE BmpHeader
id AS STRING*2 'Mostra la dicitura BM
size AS LONG 'Dimensioni del file
rr1 AS INTEGER
rr2 AS INTEGER
offset AS LONG 'Posizione di inizio dati
horz AS LONG
wid AS LONG 'Larghezza dell'immagine
hei AS LONG 'Altezza dell'immagine
planes AS INTEGER
bpp AS INTEGER 'Rileva 8 per un immagine a 256 colori
pakbyte AS LONG
imagebytes AS LONG 'Risultato di larghezza per altezza
xres AS LONG
yres AS LONG
colch AS LONG
ic AS LONG
END TYPE
DIM BMPHeader AS BmpHeader
DIM colori AS DWORD
DIM c AS DWORD
DIM I AS INTEGER
DIM b AS BYTE
DIM g AS BYTE
DIM r AS BYTE
DIM x AS WORD
DIM y AS INTEGER
DIM alignx AS WORD
DIM aligny AS WORD
DIM Altezza AS WORD
DIM Larghezza AS WORD
DIM count AS SHARED DWORD
alignx=200
aligny=100
count=1
Altezza=BMPHeader.hei-1
Larghezza=BMPHeader.wid-1
PercorsoIniziale$="C:\WINDOWS\DESKTOP\"
NuovoPercorso$="C:\WINDOWS\DESKTOP\MEDIUM\"
CHDIR NuovoPercorso$
CLS
SCREEN 12
File$=DIR$("*.bmp")
WHILE NOT count=1080
estensione$=RIGHT$(File$,4)
numerofile$=EXTRACT$(File$,estensione$)
numerofile=VAL (numerofile$)
GOSUB RIPRODUCI
File$=DIR$
WEND
END
RIPRODUCI:
IF numerofile=count THEN
OPEN File$ FOR BINARY AS #1
SEEK #1,54 'Posiziona il puntatore nel punto
'di inizio dati dell'immagine
FOR y=(74+aligny) TO aligny STEP -1 'Conta all'indietro essendo l'immagine rovesciata
FOR x=alignx TO 99+alignx
GET #1,,b 'Blue
GET #1,,g 'Verde
GET #1,,r 'Rosso
'PSET(x,y),b
PSET(x,y),INT(g/16)
'PSET(x,y),r
NEXT x
NEXT y
CLOSE #1
INCR count
File$=DIR$("*.bmp")
END IF
RETURN
Se qualcuno ha delle domande risponderò con piacere. Ci tengo comunque a sottolineare che
è ancora in fase embrionale, quindi non stupitevi se sembra troppo breve (e lo è, in effetti), come dicevo è solo un inizio.
Ora però viene il bello. Per ottenere la visualizzazione ad alta risoluzione e di tipo true-color come richiede un riproduttore per filmati che si rispetti i comandi tradizionali del Basic non sono sufficienti, bisognava esplorare altre strade, magari creare una funzione ad hoc per manipolare la grafica a livello della scheda grafica, ovvero programmandola in modo da ottenere una modalità video come si deve. Per farlo ho dovuto imparare da capo tutto il know-how e ho trovato un interessante e completo tutorial che insegna come utilizzare le specifiche SVGA in standard VESA, che tramite il corretto uso di interrupt specifici può gestire risoluzioni grafiche che possono arrivare fino a 1600x1200 pixel a 32 bit per pixel!!!
L'apprendimento non è facile, anche perchè la programmazione VESA è decisamente ostica per i principianti (come lo sono io, del resto) così come difficile sarà scrivere una sezione che sia in grado sia di rilevare quali modalità grafiche sono disponibili nel pc sia farle funzionare e infine ottenere una velocità sufficiente, ma conto di riuscirci entro qualche mese. Vi terrò aggiornati sugli ulteriori sviluppi!
P.S.
Se qualcuno poi non ha niente da fare e vuole provare a farlo girare può scaricare
questa cartella, che contiene sia tutte le immagini del filmato, sia il programma che ho postato sopra (occhio però che sono 15 MB circa). Vorrei precisare inoltre che il programma è scritto in Power Basic, quindi alcuni comandi e istruzioni potrebbero apparirvi o diversi o del tutto nuovi.
Se poi nessuno ha mai visto quel telefilm potete scaricare
il filmato originale della sigla iniziale del telefilm (circa 2 MB).
Edited by yareol - 4/8/2010, 18:45