Salve a tutti!
Da un paio di giorni ho voluto provare la spin di Fedora 18 Xfce a 64bit. Esplorandola, non essendoci gnome-shell, ho visto che mancava la possibilità della combinazione di tasti CTRL+ALT+SHIFT+R per lanciare uno screencasting (registrazione video dello schermo), che tra l’altro nel desktop di Fedora 18 era priva di audio, anche se di buona qualità! Così, ricordando l’applet Byzanz, conosciuto sotto il desktop gnome di Ubuntu, ho pensato di reinstallarlo per vedere se in Fedora Xfce ricompariva nell’elenco degli applet del pannello (con gnome-shell, in Fedora 18, non compariva), ma nulla. Rimane però sempre la possibilità di utilizzarlo da riga di comando, e la registrazione, comprensiva di audio, ho visto che viene molto bene con il comando:
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=86400 --delay=0 ~/Video/test.flv
Come potete vedere, il problema però è la necessità di dover impostare l’opzione --duration, per indicare la durata della registrazione, essendo altrimenti di default limitata a soli 10 secondi, mentre avrei voluto che potesse essere indefinita, ed interrotta solo quando voluto; in Ubuntu, infatti, il programma prevedeva un applet da poter inserire sul pannello di gnome che al click iniziava la registrazione e al successivo click la interrompeva, dando anche la possibilità di un pannello di configurazione selezionabile dal menu contestuale del click destro sull’icona, in cui si poteva impostare l’estensione per l’output, la presenza o meno dell’audio e così via…tutte le opzioni che in pratica si possono comunque dare anche da riga di comando, ma manca la possibilità di interrompere la registrazione con un semplice click. Ho pensato allora di creare due script, uno per l’avvio e l’altro per l’interruzione della registrazione:
[list=*]
*]Per l’avvio:
#!/bin/bash
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=86400 --delay=0 ~/Video/test.flv
exit
in pratica, la durata del comando deve essere impostata in secondi, e non essendoci la possibilità di rendere indefinito il tempo di registrazione fino ad avvenuta interruzione, ho impostato la durata per un giorno intero convertito in secondi, ovvero 86400 secondi (per avere un largo eccesso)./*]
[/list]
[list=*]
*]Per l’interruzione:
#!/bin/bash
pid1=$(ps -ax | grep ' byzanz-record ')
kill ${pid1}
pid2=$(ps -ax | grep ' kill_byzanz-record ')
kill ${pid2}
exit
ho creato due variabili d’ambiente, ${pid1} e ${pid2}, la prima per individuare il PID del programma byzanz-record da killare successivamente, e la seconda per individuare e killare il PID del lanciatore kill_byzanz-record che mi chiude l’applicazione byzanz-record. Non ho trovato un metodo più dolce per la chiusura del programma, ma comuque ho visto che il risultato finale è buono./*]
[/list]
Il problema è che il file test.flv che ottengo, per quanto abbia un’ottima resa di audio e video, vede una formale durata di 24 ore (gli 86400 secondi impostati per la durata), anche se poi in realtà il video dura meno, e si rende difficilissimo scorrere con lo slider per la ricerca nella timeline del video.
Allora sto cercando ora di modificare i due script. L’idea che ho avuto è quella di inserire come valore dell’opzione --duration una variabile d’ambiente, ovvero l’output del comando:
ps -p <PID> -o etime=
(con sostituito dal PID del mio processo), che mi dice da quanto tempo è in corso il mio processo identificato dal PID, ma dato che questo output mi viene espresso nel formato hh:mm:ss, avrei bisogno di convertirlo in soli secondi, che pensavo quindi di inserire come variabile d’ambiente nell’opzione --duration (quindi un primo step, dopo quel comando, è la conversione in secondi di quel formato in hh:mm:ss, e fin qui ce l’ho fatta da solo). Per raggiungere lo scopo, inoltre penso che dovrei maggiorare l’opzione --duration di ulteriori tot secondi (ad esempio 3 secondi) per permettere al processo di partire, altrimenti mi finirebbe nello stesso istante in cui parte, e in questa maniera dovrei forse riuscire ad ottenere una durata indefinita, fino al kill generato dall’altro script, ottenendo alla fine un file con una durata temporale pressoché reale, a meno di quei tot secondi di maggiorazione (es. 3 secondi)… L’idea era quindi questa. Ora stavo cercando di trasformarla in bash per testarla.
Sono riuscito a convertire l’output di quel comando in soli secondi; per testarlo ho usato come comando l’avvio di firefox:
firefox &
pid_firefox=$(ps -o pid --no-headers -C "firefox")
sec_firefox=$(ps -p ${pid_firefox} -o etime= > /tmp/firefox_elapsed_time && more /tmp/firefox_elapsed_time | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
echo ${sec_firefox}
Quindi ora si tratta di provare a usare quella variabile d’ambiente ${sec_firefox} come valore dell’opzione --duration maggiorata ad esempio di 3 secondi. Ho provato in questa maniera:
#!/bin/bash
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
sec_byzanz=$(ps -p ${pid_byzanz} -o etime= > /tmp/byzanz_elapsed_time && more /tmp/byzanz_elapsed_time | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
x=$(( ${sec_byzanz} + 3 ))
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=$x --delay=0 /home/Riccardo/Video/test.flv
exit
ma la registrazione, per quanto parta, dura solo 3 secondi. In pratica non mi fa la somma dei 3 secondi con il tempo trascorso dall’avvio di byzanz-record (ovvero la variabile d’ambiente ${sec_byzanz}), che dovrebbe essere in continua crescita, rendendo quindi di durata indefinita il processo, secondo la mia idea.
Vorrei un aiuto da qualcuno più esperto di me, essendo agli inizi nel bash script, grazie.
Riccardo