Dic 17

Bueno, como lo prometido es deuda, estuve trasteando en un script para adaptar imágenes al ipod. El script en cuestión es muy sencillito. Lo único que hace es recorrer el directorio que le indiquemos de forma recursiva, y si encuentra una imagen más alta que ancha (es decir, una imagen vertical), la inclina 90 grados para que se vea mejor en la pantalla del ipod (estamos hablando de un ipod video, con pantalla 4:3).

No hice nada más de conversión de formatos ni tamaño, ni nada por el estilo, porque de eso ya se encarga el tripod, que es un programa muy listo, así que para demás tareas, a bajárselo tocan. En fin, aquí está la obra:

#!/bin/bash

#----------PARAMETROS DE EJECUCION----------
formatos='*.bmp *.BMP *.gif *.GIF *.jpeg *.JPEG *.jpg *.JPG *.png *.PNG'
#-------------------------------------------

#----------FORMATO DE CONVERSION------------
angulo_rotacion='90'
#-------------------------------------------

#-----------FUNCIONES------------------------
function recorrer_directorios {

    for i in $formatos ; do

	if [[ -a $i ]] ; then

	    tamanho=`identify "${i}"`

	    #Eliminamos el nombre del fichero de la salida del identify
	    tamanho=${tamanho/"${i}"/}
	    tamanho=`echo $tamanho | cut -d\  -f2`

	    tamanho_h=`echo $tamanho | cut -dx -f1`
	    tamanho_v=`echo $tamanho | cut -dx -f2`

	    if (( $tamanho_v > $tamanho_h )) ; then
		convert "${i}" -rotate $angulo_rotacion "${i}"
		echo "Convertido: $i"
	    else
		echo "No convertido: $i"
	    fi
	fi

    done

    for i in * ; do

	if [[ -d $i ]]  ; then #Si el elemento es un directorio
	    cd "${i}"
	    recorrer_directorios
	    cd ..
	fi
    done
}
#-------------------------------------------

echo 'Para poder ejecutar este script'
echo 'es imprescindible tener instalado'
echo 'el pograma de conversion imagemagick.'
echo
echo 'ATENCION: este script eliminara los ficheros'
echo 'originales tras la conversion.'
echo -n 'Desea continuar? (s/n): '

read orden

if [ "$orden" = "s"  ]; then
    echo -n 'Directorio: '
    read directorio

    if [[ -d "${directorio}" ]]  ; then #Si el elemento es un directorio
	cd "${directorio}"
	recorrer_directorios
    else
	echo "Directorio no valido"
    fi
fi

También le hice unos pequeños retoques al script para pasar videos a formato ipod, para evitar que sacara unos cuantos mensajes de error inútiles que no pintaban nada y demás. Aquí está la versión definitiva:

#!/bin/bash

#----------PARAMETROS DE EJECUCION----------
ejecutable='ffmpeg'

formatos='*.asf *.ASF *.asx *.ASX *.avi *.AVI *.flv *.FLV *.m1v *.M1V *.m4v *.M4V *.mov *.MOV *.mp2 *.MP2 *.mpg *.MPG *.mpeg *.MPEG *.mp4 *.MP4 *.ogm *.OGM *.qt *.QT *.ra *.RA *.ram *.RAM *.swf *.SWF *.wmv *.WMV'
#-------------------------------------------

#----------FORMATO DE COMPRESION------------
audio_codec='libfaac'
video_codec='mpeg4'
formato_forzado='mp4'
extension='mpg'

audio_sampling_rate='44100'
audio_bitrate='128kb'
video_bitrate='300kb'

tamanho_pantalla='320x240'
#-------------------------------------------

#-----------FUNCIONES------------------------
function recorrer_directorios {

    mkdir procesados
    mkdir salida
    echo ' '

    for i in $formatos ; do

	if [[ -a $i ]] ; then

	    #Comprimimos el fichero de video pasandolo a un fichero temporal sin extension de video para no alterar el funcionamiento del bucle
	    $ejecutable -i "${i}" -acodec $audio_codec -ar $audio_sampling_rate -ab $audio_bitrate -vcodec $video_codec -b $video_bitrate -s $tamanho_pantalla -f $formato_forzado "${i}".tmp

	    #Si el tamanho de la salida es 0 por culpa del audio, recomprimimos
	    tamanhotemp=`ls -l $directorio/"${i}".tmp`
	    tamanho=`echo $tamanhotemp | cut -d\  -f5`

	    if [ "$tamanho" = "0" ] ; then

		rm "${i}".tmp
		$ejecutable -i "${i}" -vcodec $video_codec -b $video_bitrate -s $tamanho_pantalla -f $formato_forzado "${i}".tmp
	    fi

	    #Pasamos el fichero a comprimir al directorio de procesados y el fichero comprimido al directorio de salida, con la extension definitiva
	    mv "${i}" procesados
	    mv "${i}".tmp salida/"${i}".$extension
	fi
    done

    #Eliminamos los directorios temporales para no alterar el bucle
    mv salida/* .
    rm -fr salida
    rm -fr procesados

    for i in * ; do

	if [[ -d $i ]]  ; then #Si el elemento es un directorio
	    cd "${i}"
	    recorrer_directorios
	    cd ..
	fi
    done
}
#-------------------------------------------

echo 'Para poder ejecutar este script'
echo 'es imprescindible tener instalado'
echo 'el pograma de conversion ffmpeg.'
echo 'Se recomienda comprobar su correcto'
echo 'funcionamiento con el comando:'
echo 'ffmpeg -i fichero -acodec libfaac -ar 44100 -ab 128kb -vcodec mpeg4 -b 300kb -s 320x240 -f mp4 fichero_salida'
echo 'En caso de error, es imprescindible'
echo 'ajustar los parametros adecuados del ffmpeg'
echo 'en el script.'
echo
echo 'ATENCION: este script eliminara los ficheros'
echo 'originales tras la conversion.'
echo -n 'Desea continuar? (s/n): '

read orden

if [ "$orden" = "s"  ]; then
    echo -n 'Directorio: '
    read directorio

    if [[ -d "${directorio}" ]]  ; then #Si el elemento es un directorio
	cd "${directorio}"
	recorrer_directorios
    else
	echo "Directorio no valido"
    fi
fi

Ahora lo que más molaría sería que alguien además de yo mismo los usase xD. Si encontráis algún error, o alguna cosilla que se pudiese mejorar, no dudéis en decírmelo, y se hará lo que se pueda.

Dic 16

Hace un tiempo hice un script en bash para cambiar el formato a una serie de videos para poder reproducirlos en el ipod. Era un script muy sencillo, tal que así:

#!/bin/bash
mkdir procesados
mkdir salida
for i in [ *.asf *.avi *.mov *.mp2 *.mpg *.mpeg *.ram *.swf *.wmv ] ; do
ID1=$i
ID2=`echo $i | cut -d. -f1`
ffmpeg -i “${ID1}” -acodec libfaac -vcodec libxvid -b 300kb -s 320×240 -f mp4 “${ID2}”.tmp
mv “${ID1}” procesados
mv “${ID2}”.tmp salida/”${ID2}”.mpg
done

Sin embargo, y debido a la cantidad de carencias que tiene, me decidí a mejorarlo. Le puse unas cuantas variables para que sea más fácil ajustar parámetros, ahora recorre directorios de forma recursiva y alguna paridilla más. Ésto último me costó un poco hacerlo, que me tuvieron que echar una mano en el foro de teleco :P . Bueno, aquí os dejo el resultado de mi procrastinación:

#!/bin/bash

#----------PARAMETROS DE EJECUCION----------
ejecutable='ffmpeg'

formatos='*.asf *.ASF *.asx *.ASX *.avi *.AVI *.flv *.FLV *.m1v *.M1V *.m4v *.M4V *.mov *.MOV *.mp2 *.MP2 *.mpg *.MPG *.mpeg *.MPEG *.mp4 *.MP4 *.ogm *.OGM *.qt *.QT *.ra *.RA *.ram *.RAM *.swf *.SWF *.wmv *.WMV'
#-------------------------------------------

#----------FORMATO DE COMPRESION------------
audio_codec='libfaac'
video_codec='mpeg4'
formato_forzado='mp4'
extension='mpg'

audio_sampling_rate='44100'
audio_bitrate='128kb'
video_bitrate='300kb'

tamanho_pantalla='320x240'
#-------------------------------------------

#-----------FUNCIONES------------------------
function recorrer_directorios {

    mkdir procesados
    mkdir salida
    echo ' '

    for i in $formatos ; do

	#Nos hacemos con el nombre sin extension
	ID=$i

	#Comprimimos el fichero de video pasandolo a un fichero temporal sin extension de video para no alterar el funcionamiento del bucle
	$ejecutable -i "${ID}" -acodec $audio_codec -ar $audio_sampling_rate -ab $audio_bitrate -vcodec $video_codec -b $video_bitrate -s $tamanho_pantalla -f $formato_forzado "${ID}".tmp

	#Si el tamanho de la salida es 0 por culpa del audio, recomprimimos
	tamanhotemp=`ls -l $directorio/"${ID}".tmp`
	tamanho=`echo $tamanhotemp | cut -d\  -f5`

	if [ "$tamanho" = "0" ] ; then

	    rm "${ID}".tmp
	    $ejecutable -i "${ID}" -vcodec $video_codec -b $video_bitrate -s $tamanho_pantalla -f $formato_forzado "${ID}".tmp
	fi

	#Pasamos el fichero a comprimir al directorio de procesados y el fichero comprimido al directorio de salida, con la extension definitiva
	mv "${ID}" procesados
	mv "${ID}".tmp salida/"${ID}".$extension

    done

    mv salida/* .
    rm -fr salida
    rm -fr procesados

    for i in * ; do

	echo $i

	if [[ -d $i ]]  ; then #Si el elemento es un directorio
	    cd "${i}"
	    recorrer_directorios
	    cd ..
	fi
    done
}
#-------------------------------------------

echo 'Para poder ejecutar este script'
echo 'es imprescindible tener instalado'
echo 'el pograma de conversion ffmpeg.'
echo 'Se recomienda comprobar su correcto'
echo 'funcionamiento con el comando:'
echo 'ffmpeg -i fichero -acodec libfaac -ar 44100 -ab 128kb -vcodec mpeg4 -b 300kb -s 320x240 -f mp4 fichero_salida'
echo 'En caso de error, es imprescindible'
echo 'ajustar los parametros adecuados del ffmpeg'
echo 'en el script.'
echo
echo 'ATENCION: este script eliminara los ficheros'
echo 'originales tras la conversion.'
echo -n 'Desea continuar? (s/n): '

read orden

if [ "$orden" = "s"  ]; then
    echo -n 'Directorio: '
    read directorio
    cd $directorio

    recorrer_directorios
fi

Al mediodía, cuando termine de currar, haré uno para pasar las fotos a formato ipod. Lo que tengo en mente es, además de convertir el tamaño, inclinar las que sean más altas que anchas, para verlas más grandes en la pantalla del cacharro. Al tener este script ya terminado, el de las imágenes será coser y cantar. Ya lo veréis por aquí puesto.