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: