On Sat, 13 May 2006 23:32:41 +0200
Gollum1 <[EMAIL PROTECTED]> wrote:

> Alle 22:55, mercoledì 19 aprile 2006, giuliano ha scritto:
> > On Tue, 18 Apr 2006 23:03:34 +0200
> >
> > "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
> > > Alle 20:22, martedì 18 aprile 2006, giuliano ha scritto:
> > > > se ti interessa te lo passo
> > >
> > > a me interessa.
> >
> > volentieri, te lo passo in privato perche' non so se sia corretto
> > farlo in lista;
> >
> > > ciao!
> > > pOg
> >
> > ciao, giuliano
> 
> bhe, se è uno script realizzato con SW liberamente reperibile e nulla di 
> commerciale (come dici che è),può  essere di interesse per diverse 
> persone, e rimarrebbe comunque negli archivi della ML.
> 
> quindi, posta che interessa anche a me... :D

volentieri, eccolo (lo ridenomini in video.pl e setti
l'eseguibilita');

e' un programmino in perl fatto da me ma che non fa nulla se non
mettere insieme un po' di chiamate a vari sw (per non dover
ricordare tutte le opzioni);

credo che il sw usato sia tutto libero (l'ho trovato per debian e
presumo che ....); comunque il sw usato lo vedi perche' c'e' una
porzione del codice che verifica la presenza dello stesso sulla
macchina per attivare i relativi bottoni di comando;

ti sarei grato se mi segnalassi eventuali
aggiunte/modifiche/miglioramenti; 
> Byez

ciao, giuliano

#! /usr/bin/perl -w

# ------------------ problems -------------------------

# fare una verifica all'avvio per vedere le operazioni già eseguite e quindi 
attivare i segni di  spunta

# visualizzazione
#       attenzione: quando multiplexata non funziona: controllare!!!
#       a seguito del nuovo formato di visualizzazione (720x576) non funzionano 
nè xmovie nè mpeg2dec (funziona xine, ma neanche bene)

# navigazione
#       consentire la navigazione nelle directory dell'HD
#       oppure
#       lavorare all'interno di una dir <project> suddivisa in images, clip, 
ausio, video, mplex

# transizioni
#       nell'opzione della dissolvenza (su campo bianco) occorre controllare se 
c'è o no la clip campo bianco!!!!)
#       si potrebbe controllare che fra le due clip ci sia lo spazio per la 
nuova clip, per non rischiare di distruggere quella che segue

# avvertenze
#       vedere se si riesce a diminuire la dimensione del font

# video
#       per convertire da m2v(-f3) a m2v(-f8 dvd): mpeg2dec -o pgmpipe 
$video_in | pgmtoy4m -ip -r25:1 | mpeg2enc -np -I0 -f8 $video_out (pur mettendo 
-I0 ottengo un interlaced:?!)
#       implementare tutti i tipi di conversione (manuale o automatico?):
#               avi                             avi
#               m1v(-f0)                        m1v(-f0)
#               m2v(-f8)                        m2v(-f8)
#               qt                              qt
#               vcd                             vcd
#               svcd                            svcd
#       controllare interlaced mode: 0/1[/2]
#       rendere definibile dall'utente il nome finale del filmato

# audio
#       attenzione: segnalare errori se utente da ok senza scegliere audio e 
vido
#       problema di filmati lunghi che richiedono più tracce audio di fila

# sub controlla
#       adesso vengono ridimensionati solo le immagini corrette lasciando il 
posto per le immagini da sistemare a mano

# nella versione finale trasformare i button in checkbutton ed aggiungere un 
button GO unico con il quale eseguire tutte le opzioni scelte dall'utente

# cleaning
#       attivare il button

# generazione clip
#       vedere come evitare tutto l'output a video, magari mettendo solo i clip 
che vengono generati

# toolame
#       controllare se accetta anche mp3 in ingresso
#       in tal caso forse può essere evitata la memorizzazione del formato wav

# linuxvideotudio
#       cosa serve? e dov'è andato a  finire?
#       dovrebbe chiamarsi studio (l'ho visto su internet) ma non parte!

# ---------------history -------------------------------
#       0-03
#       2006-01-13
#               controlla ()
#                       corretto l'estensione da $type a $img_type (cercava i 
dvd!)
#               cambiate alcune segnalazioni all'utente

#       2006-01-12
#               transizioni ()
#                       eliminato stupido baco: copia campo_bianco.qt in 
clip_9990.qt ed aggiungeva alla lista delle clips clip_9990.q che poi non 
trovava!!
#               controlla ()
#                       opzionale il tipo di immagini da elaborare: jpg o bmp
#                       la ricerca avviene per minuscolo e per maiuscolo a meno 
che sia case sensitive
#               gestione di segni di spunta delle operazioni eseguite

#       2006-01-11
#               controlla ()
#                       modificato pesantemente algoritmo di ridimensionamento 
per risolvere anche immagini con rapporti strani
#               transizioni ()
#                       modificata la gestione del loop (sulla prima immagine) 
e della dissolvenza (a campo bianco)

#       2006_01-10
#               transizioni ()
#                       definite due variabili per loop sulla prima immagine e 
dissolvenza su campo bianco

#       2006-01-09
#               controlla ()
#                       modificata strategia ancora: ($t_width, $t_height) = 
(720, 576) e ($r_width, $r_height) = (640, 480);
#               aggiunto calcolo della durata totale in frame (controlla () e 
transizioni ())
#               transizioni ()
#                       aggiunta lla fine un loop sulla prima immagine
#                       aggiunta in fondo una dissolvenza su campo bianco
#                       gestito l'aspect ratio mediante omonima variable 
(settata a 59:54)

#       2006-01-08
#               controlla ()
#                       modificata strategia: -resize 568x426 -frame 36x27 -> 
640x480
#                       inserita conversione automatica da formato verticale
#               aggiunta opzione di menu credits ()

#       2006-01-07
#               generazione clip
#                       modificata la numerazione perchè non consentiva il 
corretto montaggio video
#               controlla ()
#                       eliminata segnalazione temporanea
#               filmato ()
#                       reintrodotta la possibilità di vedere le clip *.qt 
(lavplay)
#               transizioni ()
#                       aggiornata la codifica numerica delle clips
#                       introdotta la variabile di controllo della durata della 
transizione (inferiore o uguale alla durata delle clips)

#       0-02
#       2006-01-07
#               controllo e ridimensionamento delle immagini
#                       modificata gestione della dimensione immagini 
attraverso variabili e portata a 720x576
#                       aumentato il livello di verbosità
#                       migliorato il controllo sulla dimensione dell'immagine
#                       eliminato un bug nella lettura dei parametri 
dell'immagine
#               inserita funzione fill_number () per avere per avere la parte 
numerica dei filenames riempita di 0
#               genera_clip ()
#                       modificata pesantemente
#                       ora legge le immagini da disco (quelle ridimensionate 
img_*.jpg) e non usa più il contatore $cntr
#                       la numerazione è progressiva, senza salti
#               transizioni ()
#                       la clip di transizione ha il nome della clip che 
precede, seguito dalla lettera t
#                       ora legge le clips da disco e non usa più il contatore 
$cntr
#               filmato ()
#                       modificata la gui
#                       limitata la visualizzazione a *.m1v, *.m2v e *.mpg

#       2005-01-05
#               gui: organizzata in verticale
#               c'era un doppio exit button: eliminato
#       2005-01-06
#               filmato: aggiunta la lettura del formato *.mpg
#               audio: tolto il parametro -V dal comando mp2enc perchè 
confligge con il parametro -r48000
#               montaggio: il file DVD deve avere estensione *.m2v (con audio 
*.mp2 a parte) per DvdStyler
#               qualche ritocco alla gui
#               montaggio video: cambiato titolo alla finestra
#               controlla immagini:  cambiato titolo alla finestra
#               filamto:  cambiato titolo alla finestra
#               montaggio video: chiude la finestra appena viene dato l'ok 
dall'utente

#       0-01
#       2006-01-05
#               modificata la routine multiplexing per consentire all'utente di 
selezionare l'audio e video da multiplexare
#               aggiunta opzione -r 48000 per l'encoding mp2 (audio)
#               routine audio () ridenominata multiplex ()
#               aggiunta alla routine multiplex () il controllo di presenza di 
video e audio

#       2006-01-04
#               sub controllo ()
#                       usa "my @files = `ls *.jpg`" per mettere nell'array 
@imgs tutte le immagini, evitando così il test ($file =~ /.jpg$/))
#                       aggiunto un controllo sull'assenza di immagini da 
trattere
#                       usa @params = `identify $file` evitando la creazione a 
poi la cancellazione di tmp.txt
#               generazione clip
#                       genera clip_xxxx.qt in modo da preservare l'ordine
#               montaggio video
#                       aggiunta opzione 'dvd' (mpeg2enc con parametro -f8)
#               aggiunta button per visualizzazione filmato
#               aggiunta opzione di encoding QT e AVI
#               aggiunta riga di stato

#       2006-01-03
#                       uso la forma  "if (-x $fname) {" per i tests della 
configurazione
#                       uso la forma "if (-e glob ("*.ext")) {" per il 
controllo dell'audio: in caso di più tracce audio prednde la prima
#                       aggiunto  '&& die ".....$!\n";' alle istruzioni system
#                       aggiunta avvertenza all'utente prima del 
ridimensionamento delle immagini

#       0-00
#       2006-01-02
#                       procedura per l'audio

#       2006-01-01
#                       impianto originale (collezione di routines separate)
#                       procedura di controllo delle immagini
#                               la verifica funziona se l'immagine è già stata 
raddrizzata altrimenti no
#                       procedura per generazione delle clip
#                       procedura per le transizioni 
#                       montaggio video
#                       menu a discesa (incompleto)
#                       aggiunta opzione per formato: m1v, m2v o qt

#       2005-12-29
#                       aggiungere il sonoro
#                               mplex [audio_inp].mp2 [video_inp].m1v -b2100 -o 
[video_with_audio_out].m1v
#                       conversione da wav a mp2
#                               cat [audio_name].wav | mp2enc -v2 -V -o 
[audio_out].mp2
#                       conversione audio da mp3 a wav
#                               sox -[b|w](*) [audio_inp].wav [audio_out].wav
#                                       (*) per forzare audio a 8 (b) o 16 (w) 
bits; mp2enc non riconosce audio a 32 bits
#                       transizioni (da montare poi tra le clip con i comandi 
sotto riportati)
#                               ypipe "lav2yuv -o -f-25 
[prior_clip].[qt|avi|m1v??]" "lav2yuv -f25 [next_clip].[qt|avi|m1v??]"
#                               | transist.flt -o 0 -O 255 -d [num_frames]
#                               | yuv2lav -f[a|q] -q80 -o 
[transition_name].[avi|qt] [vedi transizioni.pl]

#       2005-12-27
#                       per fare le transizioni e gli effetti?
#                       per avere tutta la sequenza:
#                               perl -e 'for my $FRAME (1..nn) { system 
("jpeg2yuv -j [filenames]$FRAME.jpg -b[start_image] -n[frames_per_image] -f25 
-Ip | yuv2lav [-b512] -I0 -fq -o [filename]$FRAME.qt");}' (quicktime)

#       2005-12-26
#                       per convertire le immagini nel giusto formato e 
dimensione
#                               convert [image_in].[ext] -resize [w]x[h] 
[image_out].[ext]
#                       trasformare da immagini a filmati
#                               jpeg2yuv -j [filenames].jpg -b[start_image] 
-n[number_of_frames] -f25 -Ip > [filename].yuv
#                               ** cat [filename].ppm | ppmtoy4m -n[frames] -r 
-F25:1 -Ip > [filename].yuv **
#                       convertire da yuv ad altro
#                               ** cat [filename].yuv | yuv2lav [-b512] -I0 -fq 
-o [filename].qt (quicktime) **
#                               cat [filename].yuv | mpeg2enc -f0 -V512 -np -F3 
-I0 -o [finename].m1v
#                       oppure, contemporaneamente
#                               jpeg2yuv -j [filenames].jpg -b[start_image] 
-n[number_of_frames] -f25 -Ip | yuv2lav [-b512] -I0 -fq -o [filename].qt 
(quicktime)
#                       collegare i vari spezzoni
#                               lav2yuv filename??.qt | mpeg2enc [-f0] -o 
[filename].m1v; (Mpeg 1)
#                               lav2yuv filename??.qt | mpeg2enc -f3 -b4050 -o 
[filename].m2v (Mpeg 2)
#                               lav2yuv filename??.qt | yuv2lav -b512 -I0 -fq 
-o [filename].qt");} (quicktime)
# ---------------history -------------------------------

use Tk;
require Tk::BrowseEntry;

my $title = " video";
my $vers = "0-03";
my $build_date = "2006-01-13";

my $dir = "."; # $ENV{HOME};
my $img_type = "jpg";   # disponibili jpg, bmp (basta aggiungere altri al 
listbox
my $case_sen = 0;
my $sec = 5;    # sec / image
my $transiz = 1;        # transizione in sec
my $durata_totale;
my $type = "dvd";
my  ($t_width, $t_height) = (720, 576);
my  ($r_width, $r_height) = (640, 480);
my $aspect_ratio = "59:54";
my $messaggio = "";
my $loop = 1;
my $dissolvenza = 1;
my $flag_imgs = "";
my $flag_clips ="";
my $flag_trans = "";
my $flag_vid = "";
my $flag_aud = "";

# ----------gestione grafica---------------------
my $mw = MainWindow -> new(
        -title => "$title [$vers del $build_date]",
);
#$mw -> packPropagate (0);

#       ----------------------------- menu -------------------------
        my $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'x');

                $frame -> Menubutton (
                        -text => 'help',
                        -tearoff => 0,
                        -menuitems => [
                                ['command' => "about", -command => sub {
                                                                                
        $messaggio = '';
                                                                                
        about ();
                                }],
                                ['command' => "avvertenze", -command => sub {
                                                                                
        $messaggio = '';
                                                                                
        avvertenze ();
                                }],
                                ['command' => "credits", -command => sub {
                                                                                
        $messaggio = '';
                                                                                
        credits ();
                                }],
                        ]
                ) -> pack (-side => 'left');

                $frame -> Label (
                        -text => "frames",
                ) -> pack (-side => 'left');

                $frame -> Label (
                        -textvariable => \$durata_totale,
                ) -> pack (-side => 'left');

                $frame -> Label (
                        -text => "aspect ratio",
                ) -> pack (-side => 'left');

                $frame -> Label (
                        -textvariable => \$aspect_ratio,
                ) -> pack (-side => 'left');

                $frame -> Button (
                        -text => 'exit',
                        -bg => 'red',
                        -command => sub {
                                                exit ();
                        }
                ) -> pack (-side => 'right');

#       ----------------------------- buttons -------------------------

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                $frame -> Label (
                        -textvariable => \$flag_imgs,
                ) -> pack (-side => 'left');

                my $but_ctrl = $frame -> Button (
                        -text => "ridimensiona\nimmagini",
                        -state => 'disabled',
                        -command => sub {
                                $messaggio = "";
                                controlla ();
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'both');

                my $entry_img_type = $frame -> BrowseEntry (
                                -variable => \$img_type,
                                -width => 5,
                                -command => sub {
                                                print "$img_type \n";
                                }
                ) -> pack (-side => 'left');
                foreach my $i ("jpg", "JPG", "bmp", "BMP") {
                        $entry_img_type -> insert ('end', $i);
                }

                $frame -> Checkbutton (
                        -text => 'case sensitive',
                        -variable => \$case_sen,
                ) -> pack (-side => 'left');

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                $frame -> Label (
                        -textvariable => \$flag_clips,
                ) -> pack (-side => 'left');

                my $but_clip = $frame -> Button (
                        -text => "genera clip",
                        -state => 'disabled',
                        -command => sub {
                                $messaggio = "";
                                genera_clip ();
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                $frame -> Label (
                        -text => "sec/image"
                ) -> pack (-side => 'left');

                $frame -> Button (
                        -text => '<',
                        -command => sub {
                                $sec -- if ($sec > 2);
                        }
                ) -> pack (-side => 'left');

                $frame -> Label (
                        -textvariable => \$sec
                ) -> pack (-side => 'left');

                $frame -> Button (
                        -text => '>',
                        -command => sub {
                                $sec ++ if ($sec < 15);
                        }
                ) -> pack (-side => 'left');

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                $frame -> Label (
                        -textvariable => \$flag_trans,
                ) -> pack (-side => 'left');

                my $but_trans = $frame -> Button (
                        -text => "transizioni",
                        -state => 'disabled',
                        -command => sub {
                                $messaggio = "";
                                transizioni ();
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'both');

                $frame -> Button (
                        -text => '<',
                        -command => sub {
                                $transiz -- if ($transiz > 1);
                        }
                ) -> pack (-side => 'left');

                $frame -> Label (
                        -textvariable => \$transiz
                ) -> pack (-side => 'left');

                $frame -> Button (
                        -text => '>',
                        -command => sub {
                                $transiz ++ if ($transiz < $sec);
                        }
                ) -> pack (-side => 'left');

                $frame -> Checkbutton (
                        -text => 'loop',
                        -variable => \$loop,
                ) -> pack (-side => 'left');

                $frame -> Checkbutton (
                        -text => 'dissolvenza',
                        -variable => \$dissolvenza,
                ) -> pack (-side => 'left');

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                $frame -> Label (
                        -textvariable => \$flag_vid,
                ) -> pack (-side => 'left');

                my $but_vid = $frame -> Button (
                        -text => "montaggio video",
                        -state => 'disabled',
                        -command => sub {
                                $messaggio = "";
                                montaggio_video ();
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'both');

                $frame_1 = $frame -> Frame (
                ) -> pack (-side => 'left');

                        for $i ("dvd", "m1v", "m2v", "qt", "avi", "vcd", 
"svcd") {
                                $frame_1 -> Radiobutton (
                                        -text => $i,
                                        -variable => \$type,
                                        -value => $i
                                ) -> pack ();
                        }

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                $frame -> Label (
                        -textvariable => \$flag_aud,
                ) -> pack (-side => 'left');

                my $but_aud = $frame -> Button (
                        -text => "montaggio audio",
                        -state => 'disabled',
                        -command => sub {
                                $messaggio = "";
                                multiplex ();
                        }
                ) -> pack (-expand => 1, -fill => 'both');

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                my $but_clean = $frame -> Button (
                        -text => "pulizia",
                        -state => 'disabled',
                        -command => sub {
                                $messaggio = "";
                                cleaning ();
                        }
                ) -> pack (-expand => 1, -fill => 'both');

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'both');

                my $but_vis = $frame -> Button (
                        -text => "filmato",
                        -state => 'disabled',
                        -bg => 'green',
                        -command => sub {
                                $messaggio = "";
                                filmato ();
                        }
                ) -> pack (-expand => 1, -fill => 'both');

#       ---------------------- riga di stato -------------------------

        $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'x');

                $frame -> Label (
                        -textvariable => \$messaggio,
                        - bg => "yellow",
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

#       -----------------controlla la configurazione -------------------------

                 if (-x '/usr/bin/identify') {
                         if (-x '/usr/bin/convert') {
                                $but_ctrl -> configure (-state => 'normal');
                        }
                }
                 if (-x '/usr/bin/jpeg2yuv') {
                         if (-x '/usr/bin/yuv2lav') {
                                $but_clip -> configure (-state => 'normal');
                        }
                }
                 if (-x '/usr/bin/ypipe') {
                         if (-x '/usr/bin/lav2yuv') {
                                 if (-x '/usr/bin/transist.flt') {
                                        $but_trans -> configure (-state => 
'normal');
                                }
                        }
                }
                 if (-x '/usr/bin/mpeg2enc') {
                        $but_vid -> configure (-state => 'normal');
                }
                 if (-x '/usr/bin/mp2enc') {
                         if (-x '/usr/bin/sox') {
                                 if (-x '/usr/bin/mplex') {
                                        $but_aud -> configure (-state => 
'normal');
                                }
                        }
                }
                 if (-x '/usr/bin/mpeg2dec') {
                        $but_vis -> configure (-state => 'normal');
                }

avvertenze ();
MainLoop;
die;

# ------------------------------ subroutines generali 
-------------------------------------

sub about {
        $mw -> messageBox (
                        -title => 'about',
                        -message => "$title
$vers
[$build_date]
               ***
procedura per la trasformazione di immagini still in filmato, con o senza audio;
Presume di trovare solo immagini
- tipo Jpeg
- in formato landscape
- in ordine corretto
- fino ad un massimo di 4999 (NB: non c'è test)
nella directory corrente.
               ***
usa:
        identify + convert (ImageMagick) per controllo immagini
        jpeg2yuv + yuv2lav (mjpegtools) per la creazione di clip da immagini
        ypipe + lav2yuv + transist.flt + yuv2lav per le transizioni
        lav2yuv + mpeg2enc per il montaggio video
        mp2enc per l'encoding mp2
        sox per il deconding da mp3
        mplex per l'unione degli stream audio e video
al momento non vengono usati i numerosi e potenti parametri degli applicativi 
citati, forse in un futuro....
               ***
by Giuliano Curti
[EMAIL PROTECTED]
[EMAIL PROTECTED]
        ");
}

sub avvertenze {
        $mw -> messageBox (
                        -title => 'avvertenze',
                        -message => "procedura sperimentale
        ....
controllare immagini con estensioni min e maiusc
        ");
}

sub credits {
        $mw -> messageBox (
                        -title => 'avvertenze',
                        -message => "Credits:
- imagemagick studio
- rainer johanni, gernot ziegler and others (mjpegtools)
- philipp zabel (lavpipe))
- laurent alacoque (mpgtx)
- michel lespinasse & aaron holtzman (mpeg2dec)
- scott smith (dvdauthor)
- alex thuering (dvdstyler)
- monty & xiphophorus (cdparanoia)
- chris bagwell (sox)
- andy polyakov (dvd+rw-tools)
- k3b team
- debian.org + mandrakesoft
- giuliano curti (video.pl)
        ");
}

sub fill_number {

        my $num = shift;
        my $length = shift;

        my $base = log (10);
        my $f_num = "";
        $num =~ s/^0+//;        # toglie gli eventuali zero in testa

        if ($num > 0) {
                $l = int (log ($num) / $base) + 1;      # print "logaritmo di 
$num: $l\n";
        } else {
                $l = 1;
        }

        for my $i (1..$length - $l) {
                $f_num = $f_num."0";
        }
        return ($f_num.$num);
}

# ------------------------------ subroutines specifiche 
-------------------------------------

sub controlla {
#       -------------------------------------
#        controlla e ridimensiona se necessario le immagini
#       -------------------------------------

        my (@imgs, $file, @params, $width, $height, $out, $command);
        my ($n_width, $n_height);
        my ($frame_x, $frame_y);
        my ($a, $b);

        $command = "ls *.$img_type";
        $command = "$command *." . uc ($img_type) if (! $case_sen);
        @imgs = `$command`;
        if (! @imgs) {
                $messaggio = "non ci sono immagini da trattare";
                print "$messaggio\n";
                return;
        }

#       ----------gestione grafica---------------------
        my $mw = MainWindow -> new(
                -title => "controlla immagini [$title $vers del $build_date]",
        );

                $mw -> Label (
                        -text => "ATTENZIONE 1
le immagini ruotate non vengono riconosciute
in quanto il formato è sempre landscape.
E' consigliabile un controllo manuale delle
immagini prima di procedere
ATTENZIONE 2
attenzione: riesco al momento a lavorare solo
con immagini 640x480 in un frame full Pal 720x576
pertanto questa è la dimensione cui verranno
convertite le immagini
                ") -> pack (-expand => 1, -fill => 'x');

        my $frame = $mw -> Frame (
        ) -> pack (-expand => 1, -fill => 'x');

                $mw -> Button (
                        -text => "cancel",
                        -command => sub {
                                $mw -> destroy ();
                                return;
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                $mw -> Button (
                        -text => 'go',
                        - bg => 'red',
                        -command => sub {
                                        print "sto procedendo, sii paziente, ci 
vorrà un pò di tempo......\n";
                                        $mw -> destroy ();

                                        my $cntr = 0;
                                        foreach $file (sort @imgs) {
                                                $file =~ s/\n//;
                                                $cntr ++;       # aggiorna 
sempre il contatore per lasciare il posto delle immagini eventualmente da 
sistemare
                                                $out = "img_" . fill_number 
($cntr, 4) . ".jpg";
                                                @params = split /\s/, `identify 
$file`;
                                                 ($width, $height) = split /x/, 
$params[2];
                                                if (! $width or ! $height) {
                                                        print "immagine $file: 
dimensioni nulle ($width:$height), controlla parametri $params[0] $params[2]\n";
                                                } else {
                                                        ($n_width, $n_height) = 
($r_width, $r_height);
                                                        $a = $n_width / $width;
                                                        $b = $n_height / 
$height;
                                                        if ($a < $b) {
                                                                $n_width = 2 * 
int (($a * $width) / 2 + 0.5);
                                                                $n_height = 2 * 
int (($a * $height) / 2 + 0.5);
                                                        } elsif ($b < $a) {
                                                                $n_width = 2 * 
int (($b * $width) / 2 + 0.5);
                                                                $n_height = 2 * 
int (($b * $height) / 2 + 0.5);
                                                        }
                                                        $a = $n_width / $width;
                                                        $b = $n_height / 
$height;
                                                        $frame_x = ($t_width - 
$n_width) / 2;
                                                        $frame_y = ($t_height - 
$n_height) / 2;

                                                        $command = "convert 
$file -affine $a,0,0,$b,0,0 -transform -frame $frame_x"."x"."$frame_y 
-mattecolor \"#ababab\" $out";
                                                        system ($command) && 
die ".....$!\n";

                                                        print "$cntr: immagine 
$params[0] ridimensionata in $out\n";
                                                }
                                        }
                                        print "processate $cntr immagini\n";
                                        $flag_imgs = "x";
                                        return;
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');
}

sub genera_clip {
#       ------------------------------------------------
#       - conversione da still a clip
#       - la numerazione lascia i buchi per le transizioni

#       - valutare un formato diverso da QT per risparmiare spazio -
#       - ma verificare che tutti i passi successivi rimangono validi -
#       ------------------------------------------------

        my (@imgs, @tmp, $file_in, $file_out, $durata, $command);

        @imgs = `ls img_*.jpg`;
        if (! @imgs) {
                $messaggio = "non ci sono immagini da trattare";
                print "$messaggio\n";
                return;
        }
        print "sto procedendo, sii paziente, ci vorrà un pò di tempo......\n";
        $durata_totale = 0;
        for $file_in (@imgs) {
                $file_in =~ s/\n$//;
                print "dall'immagine $file_in.....";

                $file_in =~ s/\n$//;
                @tmp = split /_/, $file_in;
                $tmp [1] =~ s/.jpg$//;
                $file_out = sprintf "clip_" . fill_number (2 * $tmp [1], 4) . 
".qt";
                $durata = 25 * $sec;
                $durata_totale = $durata_totale + $durata;
                $command = "jpeg2yuv -j $file_in -n$durata -f25 -Ip | yuv2lav 
-I0 -fq -o $file_out"; # -b512
                system ($command) && die ".....$!\n";
                print "..alla clip $file_out\n";
        }
        my $num = @imgs;
        print "eseguite ", $num, " clips \n" ;
        $flag_clips ="x";
}

sub transizioni {
#       --------------------------------------------
#       - transizione fra le immagini contigue
#       --------------------------------------------

        my (@clipgs, $clip_1, $clip_2, $clip_out, $durata, $command);

        @clips = `ls clip_*.qt`;
        if (! @clips) {
                $messaggio = "non ci sono clips da trattare";
                print "$messaggio\n";
#               return;
        }
        print "sto procedendo, sii paziente, ci vorrà un pò di tempo......\n";

#       ---------------- loop con la prima immagine ----------
        if ($loop) {
                $clip_1 = $clips [0]; chop ($clip_1);
                $clip_2 = "clip_9980.qt";
                system ("cp $clip_1 $clip_2");  # dovrebbe controllare che non 
cia sia già la clip_9980.qt però....
                push @clips, $clip_2;
        }
#       ---------------- dissolve sul campo bianco ----------
        if ($dissolvenza) {
                $clip_2 = "clip_9990.qt";
                system ("cp campo_bianco.qt $clip_2");  # anche qui dovrebbe 
controllare che non ci sia la clip_9990.qt ed anche che esista la clip 
campo_bianco.qt
                push @clips, $clip_2;
        }

        $durata = 25 * $transiz;

        for my $i (0 .. @clips - 2) {   # meno 1 perchè base 0 e meno l'ultima
                $clip_1 = $clips [$i]; $clip_1 =~ s/\n$//;
                $clip_2 = $clips [$i + 1]; $clip_2 =~ s/\n$//;
                @tmp = split /_/, $clip_1;
                $tmp [1] =~ s/.qt$//;
                $clip_out = "clip_" . fill_number ($tmp [1] + 1, 4) . ".qt";
                $durata_totale = $durata_totale + $durata;
                print "eseguo transizione fra $clip_1 e $clip_2.....";

                $command = "ypipe \"lav2yuv -o -$durata -A $aspect_ratio 
$clip_1\" \"lav2yuv -f $durata -A $aspect_ratio $clip_2\" | transist.flt -o 0 
-O 255 -d $durata| yuv2lav -I0 -fq -o $clip_out";
                system ($command) && die ".....$!\n";
                print ".. nella clip $clip_out\n";
        }
        print "generate ", @clips - 1, " transizioni\n";
        $flag_trans = "x";
}

sub montaggio_video {
#       ------------------------------------
#       - montaggio video
#       ------------------------------------

        my $command;

#       ----------gestione grafica---------------------
        my $mw = MainWindow -> new(
                -title => "montaggio video [$title $vers del $build_date]",
        );

                $mw -> Label (
                        -text => "ATTENZIONE
i file devono essere numerati in ordine progressivo;
li puoi ancora correggere ora, se necessario"
                ) -> pack (-expand => 1, -fill => 'x');

                my $frame = $mw -> Frame (
                ) -> pack (-expand => 1, -fill => 'x');

                $mw -> Button (
                        -text => "cancel",
                        -command => sub {
                                $mw -> destroy ();
                                return;
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                $mw -> Button (
                        -text => 'go',
                        - bg => 'red',
                        -command => sub {
                                $mw -> destroy ();
                                print "sto procedendo, sii paziente, ci vorrà 
un pò di tempo......\n";
                                if ($type eq "dvd") {
                                        print "DVD\n";
                                        $command = "lav2yuv clip_????.qt | 
mpeg2enc -np -I0 -f8 -o video.m2v";
                                } elsif ($type eq "m1v") {
                                        $command = "lav2yuv clip_????.qt | 
mpeg2enc -np -I0 -f0 -b4050 -o video.m1v";
                                } elsif ($type eq "m2v") {
                                        $command = "lav2yuv clip_????.qt | 
mpeg2enc -np -I0 -f3 -b4050 -o video.m2v";
                                } elsif ($type eq "qt") {
                                        print "QT: opzione sperimentale\n";
                                        $command = "lav2yuv clip_????.qt | 
yuv2lav -fq -I0 -o video.qt";
                                } elsif ($type eq "avi") {
                                        print "AVI: opzione sperimentale\n";
                                        $command = "lav2yuv clip_*.qt | yuv2lav 
-fa -I0 -o video.avi";
                                } elsif ($type eq "vcd") {
                                        $messaggio = "VCD: opzione non 
disponibile";
                                        print "$messaggio\n";
                                        return;
                                } elsif ($type eq "svcd") {
                                        $messaggio = "SVCD: opzione non 
disponibile";
                                        print "$messaggio\n";
                                        return;
                                }
                                system ($command) && die ".....$!\n";
                                print "completato il montaggio video\n";
                                $flag_vid = "x";
                                return;
                        }
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');
}

sub multiplex {

#       -------------------------------------------
#       - cerca l'audio, lo codifica in mp2, se non lo è già
#       - e lo aggiunge al video
#       -----------------------------------------

        my (@video, @audio, $i, $video, $audio, $out, $command);

        @video = `ls *.m1v *.m2v`;
        if (! @video) {
                $messaggio = "non ci sono video da montare";
                print "$messaggio\n";
                return;
        }
        @audio = `ls *.mp2 *.mp3 *.wav`;
        if (! @audio) {
                $messaggio = "non ci sono audio da montare";
                print "$messaggio\n";
                return;
        }

#       ----------gestione grafica---------------------
        my $mw = MainWindow -> new(
                -title => "multiplexing [$title $vers del $build_date]",
        );

                my $frame = $mw -> Frame (
                ) -> pack (-side => 'bottom', -expand => 1, -fill => 'x');

                        $frame -> Button (
                                -text => 'go',
                                - bg => 'red',
                                -command => sub {
                                        print "sto procedendo, sii paziente, ci 
vorrà un pò di tempo......\n";
                                        print "controllo l'audio....";
                                        if ($audio !~ /.mp2/) {
                                                print "non è audio mp2, è audio 
wav?\n";
                                                if ($audio !~ /.wav/) {
                                                        print "non è audio wav, 
è audio mp3?\n";
                                                        if ($audio !~ /.mp3/) {
                                                                print "non è un 
mp3, non posso più continuare\n";
                                                                return;
                                                        }
                                                        print "sì, converto mp3 
in wav ...";
                                                        ($out = $audio) =~ 
s/.mp3$/.wav/;
                                                        system ("sox $audio -w 
$out") && die ".....$!\n";
                                                        $audio = $out;
                                                        print "..okay\n";
                                                }
                                                print "sì, converto wav in 
mp2.....";
                                                ($out = $audio) =~ 
s/.wav$/.mp2/;
                                                system ("cat $audio | mp2enc 
-v2 -r48000 -o $out") && die ".....$!\n";
                                                $audio = $out;
                                                print "..okay\n";
                                        }
                                        print "ok, adesso lo monto con il 
video...";

                                        if ($type eq "dvd") {
                                                print "DVD\n";
                                                $out = "finale_$video"; # 
mantiene la stessa estensione del sorgente
                                                $command = "mplex -f8 $audio 
$video -o $out";
                                        } elsif ($type eq "m1v") {
                                                $messaggio = "MPEG 1: opzione 
non disponibile";
                                                print "$messaggio\n";
                                                return;
                                        } elsif ($type eq "m2v") {
                                                        $messaggio = "MPEG 2: 
opzione non disponibile";
                                                print "$messaggio\n";
                                                return;
                                        } elsif ($type eq "qt") {
                                                $messaggio = "QT: opzione non 
disponibile";
                                                print "$messaggio\n";
                                                return;
                                        } elsif ($type eq "avi") {
                                                $messaggio = "AVI: opzione non 
disponibile";
                                                print "$messaggio\n";
                                                return;
                                        } elsif ($type eq "vcd") {
                                                $messaggio = "VCD: opzione non 
disponibile";
                                                print "$messaggio\n";
                                                return;
                                        } elsif ($type eq "svcd") {
                                                $messaggio = "SVCD: opzione non 
disponibile";
                                                print "$messaggio\n";
                                                return;
                                        }
                                        system ("mplex $audio $video -b2100 -o 
$out") && die ".....$!\n";
                                        print "..okay\n";
                                        $flag_aud = "x";
                                }
                        ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                        $frame -> Button (
                                -text => "cancel",
                                -command => sub {
                                        $mw -> destroy ();
                                        return;
                                }
                        ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                $frame = $mw -> Frame (
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                        for $i (@video) {
                                $i =~ s/\n$//;
                                $frame -> Radiobutton (
                                        -text => $i,
                                        -variable => \$video,
                                        -value => $i
                                ) -> pack (-anchor => 'w', -expand => 1, -fill 
=> 'x');
                        }

                $frame = $mw -> Frame (
                ) -> pack (-side => 'left', -expand => 1, -fill => 'x');

                        for $i (@audio) {
                                $i =~ s/\n$//;
                                $frame -> Radiobutton (
                                        -text => $i,
                                        -variable => \$audio,
                                        -value => $i
                                ) -> pack ();
                        }
}

sub cleaning {
# ------------------------------------
#       - pulizia di tutti i file intermedi
# ------------------------------------

        system ("rm img_????.jpg") && die ".....$!\n";
        system ("rm clip_????.qt") && die ".....$!\n";
}

sub filmato {
#       ---------------------------------------
#       visualizza un filmato in formato m1v, m2v o qt; 2 dvd?
#       ---------------------------------------

        my @film = `ls *.mpg *.m1v *.m2v *.qt`;
        if (! @film) {
                $messaggio = "non ci sono filmati da visualizzare";
                print "$messaggio\n";
                return;
        }

#       ----------gestione grafica---------------------
        my $mw = MainWindow -> new (
                -title => "filmato [$title $vers del $build_date]",
        );

                $mw -> Button (
                        -text => "exit",
                        -bg => "red",
                        -command => sub {
                                $mw -> destroy ();
                                return;
                        }
                ) -> pack (-expand => 1, -fill => 'x');

                my $count = -1;
                my $frame;

                for my $i (@film) {
                        $count ++;
                        if ($count - 7 * int ($count / 7) == 0) {       # ogni 
7 va a capo
                                $frame = $mw -> Frame (
                                ) -> pack ();
                        }
                        $frame -> Button (
                                -text => $i,
                                -command => sub {
                                        if ($i =~ /.m[1-2]v$/ or $i =~ /.mpg$/) 
{
                                                system ("mpeg2dec $i");
                                        } elsif ($i =~ /.qt$/) {
                                                system ("lavplay $i");
                                        } else {
                                                $messaggio = "formato video 
ignoto";
                                                print "$i: $messaggio \n";
                                        }
                                }
                        ) -> pack (-side => 'left', -expand => 1, -fill => 'x');
                }
}

Rispondere a