pspvm.sh – psp video maker

Questa sera vi presento uno scriptino basato su ffmpeg che ho buttato giù per convertire i video da vari formati al formato più digeribile dalla psp, e cioè il .mp4.
Lo script in questione può essere lanciato con 3 diverse opzioni e genererà output in base all’opzione scelta, andiamo a vederle nel dettaglio:

la prima opzione che definirei la più importante è l’opzione –video abbreviata -v, permette all’utente di convertire un video da un formato qualsiasi all’.mp4 compatibile con la psp. Quest’opzione richiede che le siano passati 2 parametri, il primo è ovviamente il nome del file da convertire, il secondo è il nome del file che risulterà dalla conversione (senza l’estensione, quella sarà aggiunta automaticamente). Non ho previsto che lo script usi lo stesso nome del file originale per evitare problemi nel caso in cui si converta un mp4 non compatibile con la psp in un mp4 ottimizzato, in quel caso infatti, usando lo stesso nome lo script sarebbe uscito in quanto il file finale esisterebbe già.

La seconda opzione disponibile è l’opzione –thumb o -t se preferite ;) . Quest’opzione si occuperà di creare un’anteprima del video che potrà essere visualizzata nel menu della psp, in questo modo se avrete dato un nome poco indicativo al vostro video, almeno l’anteprima vi darà una mano a ricordare di cosa si  tratta… Perchè quest’opzione funzioni dovremo passare anche stavolta 2 parametri, il primo è ovviamente il nome del video (conviene prendere quello già convertito), e il secondo parametro è un numero, e cioè il secondo da cui vorremo estrarre il fotogramma che farà da anteprima…

L’ultima opzione disponibile è –help abbreviata in -h, quest’opzione mostrerà un aiuto dettagliato sulle funzioni dello script e vi aiuterà a capire come usare le varie opzioni disponibili…

Mi sembra sia tutto, quindi passiamo allo script vero e proprio:

#! /bin/bash


##### EXIT STATUS #####

E_INTERROR=71
E_NOINPUTVIDEOT=72
E_ALREADYTHM=73
E_NOSEC=74
E_NOINPUTVIDEOV=75
E_NOOUTPUTVID=76
E_NOOPT=77
E_HELP=78
E_COMMNOTFOUND=79

##### FUNZIONI #####

# showerror
showerror ()
{
	if [ -z $1 ];then
		echo "INTERNAL ERROR - ABORTING"
		exit $E_INTERROR
	fi
	case $1 in
		01)
			echo "non hai indicato un video da cui prendere l'anteprima o il video \"$INPUT_VIDEO\" non esiste"
			exit $E_NOINPUTVIDEOT
		;;
		02)
			echo "il file di output \"$THUMBNAME.thm\" esiste già"
			exit $E_ALREADYTHM
		;;
		03)
			echo "non hai indicato il secondo da cui prendere il fotogramma per l'anteprima"
			exit $E_NOSEC
		;;
		04)
			echo "non hai indicato un video da convertire o il video \"$INPUT_VIDEO\" non esiste"
			exit $E_NOIMPUTVIDEOV
		;;
		05)
			echo "non hai indicato un nome per creare il video di output o \"$OUTPUT_VIDEO.mp4\" esiste già"
			exit $E_NOOUTPUTVID
		;;
		06)
			echo "non hai specificato nessuna opzione"
			showhelp
			exit $E_NOOPT
		;;
	esac
}

# showhelp
showhelp ()
{
	echo -e "USO: $(basename $0) <option> [input video name.ext] [time] [output video name]"
	echo -e "\tdove <option> è una tra:";echo
	echo -e "\t-v | --video\tconverte il video [input video name.ext] nel video [output video name].mp4"
	echo -e "\t\t\tl'opzione richiede 2 nomi, il primo deve essere il video da convertire, il secondo"
	echo -e "\t\t\tè il nome del video risultante (senza l'estensione)"
	echo -e "\t-t | --thumb\testrae un'anteprima dal video e la salva con lo stesso nome del file di"
	echo -e "\t\t\torigine ma con estensione .thm per poter essere letta dalla psp. Richiede il nome"
	echo -e "\t\t\tdel file di origine e il tempo, espresso in secondi, da cui estrarre l'immagine."
	echo
	echo -e "ESEMPI:"
	echo -e "$(basename $0) --video /home/danix/completa_attenzione.avi completa_attenzione"
	echo
	echo -e "$(basename $0) --thumb /home/danix/completa_attenzione.mp4 22"
	echo
}





##### MAIN #####


if [ $# -eq 0 ];then
	showerror 06
	#echo "showerror(06)"
else
	while [ $# -gt 0 ];do
			case $1 in
			-t|--thumb)
				INPUT_VIDEO=$2
				SECOND=$3
				#NAME=$(echo $INPUT_VIDEO|sed -re "s/(.*\/)(.*.[amf][vlp][igv4])$/\2/")
				#THUMBNAME=${NAME%[amf][vlp][igv4]}thm
				THUMBNAME=$(echo $INPUT_VIDEO | rev | cut -f 2 -d .| rev)
				shift
				if [[ -z $INPUT_VIDEO || ! -f $INPUT_VIDEO ]];then
					showerror 01
					#echo "showerror(01)"
					#exit 1
				elif [[ -f $THUMBNAME.thm ]];then
					showerror 02
					#echo "showerror(02)"
					#exit 1
				elif [ -z $SECOND ];then
					showerror 03
					#echo "showerror(03)"
					#exit 1
				fi
				ffmpeg -y -i $INPUT_VIDEO -f image2 -ss $SECOND -vframes 1 -s 160×120 -an $THUMBNAME.thm
				exit 0
			;;
			-v|--video)
				INPUT_VIDEO=$2
				OUTPUT_VIDEO=$3
				shift
				if [[ -z $INPUT_VIDEO || ! -f $INPUT_VIDEO ]];then
					showerror 04
					#echo "showerror(04)"
					#exit 1
				elif [[ -z $OUTPUT_VIDEO || -f ${OUTPUT_VIDEO}.mp4 ]];then
					showerror 05
					#echo "showerror(05)"
					#exit 1
				fi
				ffmpeg -i $INPUT_VIDEO -f psp -r 29.97 -b 768k -ar 24000 -ab 64k -s 320x240 $OUTPUT_VIDEO.mp4
				exit 0
			;;
			-h|--help)
				showhelp
				exit $E_HELP
			;;
			*)
				showhelp
				exit $E_COMMNOTFOUND
			;;
		esac
		shift
	done
fi

Fatemi sapere che ne pensate e se per caso vi torna utile… ovviamente è rilasciato sotto GPL v3 e quindi siete liberi di farci ciò che vi pare…

bye ;)

EDIT:
non uso più la psp da un pezzo, comunque ho caricato lo script come gist su github così chiunque può prenderlo e modificarlo come crede..

enjoy!

Danilo M.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

This site uses Akismet to reduce spam. Learn how your comment data is processed.