[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Creare video con immagine statica + file audio



On Mon, 21 Sep 2009 13:28:48 +0200
giopas <linux@giopas.eu> wrote:

> Grazie per le risposte, ragazzi!
> 2009/9/21 giuliano <giulianc@tiscali.it>
> 
> > ho affrontato un caso un po' diverso, ma visto che insisti .... te
> > lo dico :-)))
> 
> 
> Troppo buono!! :)

spero si sia capita l'(auto)ironia :-))))

> se ti interessa qualcosa di piu' rinfresco i dettagli e te li passo;
> 
> 
> Accidenti! Beh, sì se avessi ancora lo scriptino in perl (io sono
> totalmente ignorante in materia), potrei vedere come usarlo...

eccolo allegato: lo rinomini in video.pl (ma forse non necessario)
ed abiliti il bit di esecuzione, necessita di perl-tk e dovrebbe
funzionare;
dovrebbe fare all'inizio un controllo se sono installati tutti i sw che
usa, guardandolo puoi vedere direttamente quali sono;

per il resto non ricordo quasi nulla, se pero' decidi di avventurarti
nella lettura, prova a chiedere :-)))


> Grazie ad entrambi per l'aiuto e buon lavoro!
> 
> giopas

anche a te, 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
[giulianc\@libero.it]
[giulianc\@tiscali.it]
	");
}

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');
		}
}

Reply to: