Repository 32bit  Forum
Repository 64bit  Wiki

Mencoderprogress

Da Slacky.eu.


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 toZenAviMplayer, 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...".

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.

414n

Strumenti personali
Namespace

Varianti