Mencoderprogress: differenze tra le versioni
(2 versioni intermedie di uno stesso utente non sono mostrate) | |
(Nessuna differenza)
|
Versione attuale delle 10:26, 4 ott 2008
For an english version of this page, please go here
Indice
Introduzione
Inizialmente avevo pensato di creare uno script che riuscisse ad estrapolare l'avanzamento delle conversioni video di ffmpeg per poter visualizzare una comoda percentuale al posto della posizione attuale in secondi all'interno del film (non proprio il massimo per dare un'idea dell'avanzamento). Dopo aver realizzato tale script (che verrà pubblicato prossimamente qui su Wikislacky) mi sono buttato nella realizzazione di un analogo script per mencoder.
mencoder non necessiterebbe di un'interfaccia che elabori la percentuale di avanzamento dall'output prodotto dal programma stesso, dato che ne presenta già una di suo. Tuttavia, in alcuni casi, essa rimane sempre a 0% mentre l'avanzamento temporale (la posizione in secondi) funziona sempre.
In vista di ciò ho prodotto il seguente script. Esso viene chiamato automaticamente dal mio altro script toZenAviMencoder, anch'esso pubblicato qui su Wikislacky.
Descrizione
Questo script si pone come interfaccia per nascondere il normale output di mencoder su standard output (stdout), per mostrare al suo posto un avanzamento, espresso in percentuale. Se dialog è presente nel path, esso sarà usato. Altrimenti l'avanzamento verrà stampato a video tramite un normale echo.
Versione corrente
La versione corrente è la 1.01 del 02/10/2008.
Requisiti
- GNU Bash
- Per eseguire lo script.
- mencoder
- Per produrre l'output da elaborare.
- awk
- Per processare/filtrare informazioni.
Configurazione
Lo script deve essere lanciato in pipe con mencoder, in modo da catturarne lo standard output. Un esempio di uso è il seguente:
mencoder <parametri vari> | mencoderprogress.sh 634 "Conversione di trallallero trallalà"
dove:
- 634
- È la durata in secondi del filmato che si sta convertendo. Sono stato costretto a metterlo come parametro a riga di comando perché l'output di mencoder (al contrario di quello di ffmpeg) non include tale informazione, non appena si lancia una conversione. Se non specificato, il valore di default "9999999" viene utilizzato (non che abbia molto senso...).
- "Conversione di trallallero trallalà"
- È il messaggio da visualizzare durante la conversione. Se non specificato, verrà visualizzato il messaggio "Converting video...".
UPDATE
Con l'aggiornamento alla versione 1.01 è stata inserita una nuova variabile configurabile dall'utente:
- REFRESH_TIME
- Indica ogni quanto tempo aggiornare la percentuale, in secondi. Se non impostato, il valore di default è 3 secondi.
Script
#!/bin/bash # # Script per mostrare il progresso di una conversione operata da mencoder # Fabbricato per vossignori da 414N <414N chiocciolinainaina slacky PUNTO it> # 02/09/2008 # Versione 1.01 # Parametri: # (stdin) : output di mencoder in pipe # $1 : Durata del filmato (in secondi) # $2 : Messaggio da visualizzare # Controllo argomenti DURATION=${1:-"9999999"} MESSAGE=${2:-"Converting video..."} # Variabile che contiene il precedente valore di progresso calcolato. Viene usata per risparmiare stampate a video OLDPROGRESS=0 # Variabile contenente il progresso attuale, calcolato di volta in volta PROGRESS=0 # Intervallo di refresh della percentuale (per migliorare un po' la performance) # Espresso in secondi REFRESH_TIME=${REFRESH_TIME:-3} # Controllo della presenza di dialog nel path if [ -z "$USE_DIALOG" ] then if [ `which dialog 2>/dev/null` = "" ] then USE_DIALOG=0 else USE_DIALOG=1 fi fi # Funzione per la stampa su schermo del progresso # # Parametri: # $1 = Progresso attuale (intero) function print_progress () { if [ "$USE_DIALOG" = 0 ] then echo -ne "$MESSAGE : $1%\r" else echo "$1" | dialog --title "mencoder video conversion" --gauge "$MESSAGE" 10 50 fi } print_progress 0 while read -e -d $'\r' INFO do ACTUAL_TIME=$(echo "$INFO" | awk -F's' '{gsub(/ */,"",$2); print $2}' | cut -d':' -f2 | awk '/^([1-9][0-9]*\.[0-9]*)$/') if [ $ACTUAL_TIME ] then PROGRESS=$(echo "$ACTUAL_TIME $DURATION" | awk '{printf "%.0f\n",$1 / $2 * 100}') if [ "$PROGRESS" -ne "$OLDPROGRESS" ] then print_progress "$PROGRESS" OLDPROGRESS="$PROGRESS" read -t "$REFRESH_TIME" fi fi done if [ "$PROGRESS" -eq 0 ] then exit 1 else print_progress 100 fi exit 0
Installazione
È sufficiente inserire lo script all'interno del path e renderlo eseguibile. Consiglio di creare una cartella (ad esempio bin) all'interno della propria home e di inserirla nel PATH, andando a modificare/creare i file ~/.bashrc e ~/.bash_profile nel seguente modo:
export PATH+=":~/bin"
Changelog
- 1.00
- versione iniziale dello script.
- 1.01
- aggiunto un intervallo di refresh per migliorare un po' la performance.
Feedback
Se avete suggerimenti/segnalazioni, per favore fiondatevi a scrivere un post qui.