Sunday, March 02, 2008

Sistema de grabación remoto

Hace unas semanas me hice con una magnífica tarjeta capturadora de televisión HVR4000 y la monté sobre mi barebone Asus, la verdad que funciona muy bien y la calidad que consigue tanto para satélite como para tdt es muy buena sobre una pantalla Dell de 22 pulgadas panorámica.

El caso es que ayer me llamó mi mamá diciéndome que se le había estropeado de nuevo el vídeo vhs y que si podía hacer algo para grabar su serie favorita y que ella la pudiera ver por la noche. Teniendo en cuenta que yo estoy en Madrid y ella en Alicante, decidí sacar un poco de partido a la tarjeta capturadora y realizar un pequeño script que grabara la serie en cuestión, la comprimiera y la enviara a su ordenador de Alicante. Todo ello sin que yo tuviera que preocuparme por pulsar una sola tecla de mi ordenador.

Se me ha quedado una espina clavada, y es no haberlo conseguido sobre Linux, debido a que cuando instalé los drivers en desarrollo de la citada tarjeta de tv, dejó de funcionarme la webcam, pero en cuanto esos drivers estén un poco más maduros su aplicación en Linux es incluso más sencilla que sobre Window$.

Para poder realizarlo sobre Window$ he utilizando MediaPortal una suite Multimedia de código abierto, esta aplicación será la encargada de realizar la grabación de la serie de Lunes a Viernes a la misma hora, programable desde la misma aplicación. El archivo generado por MediaPortal es del tipo dvr-ms (Microsoft Digital Video Recording), un formato propietario de Micro$oft que nos dificultará un poco su transformación. Este tipo de archivo ocupa una gran cantidad de espacio en el disco duro que necesitamos comprimir de alguna manera para poder enviar el archivo resultante a través de Internet.

Los programas que he utilizado para procesar tanto video como audio son: DVRMSToolbox para la transformación del formato dvr-ms a MPEG, y Dr. Divx 2.0 OSS para la compresión desde MPEG a DivX

Una vez adecuado el archivo, utilizo cygwin tanto en el cliente como en el servidor y mando el archivo mediante scp (secure copy) desde Madrid a Alicante.
Para poder utilizar scp sin tener que introducir la clave del servidor he añadido la clave pública del cliente en el directorio correspondiente del servidor:

# Genero las claves
dani@madrid:~$ ssh-keygen -t rsa -b 1024
#Con esto se generará en ~/.ssh/ dos ficheros, id_rsa(clave privada) y id_rsa.pub(clave pública)
# Copio la clave pública del cliente a la máquina destino.
dani@madrid:~$ssh dani@alicante "cat >>~/.ssh/authorized_keys" <~/.ssh/id_rsa.pub
#Realizar un ssh para comprobar que accedemos sin que nos pida la clave
dani@madrid:~$ ssh dani@alicante

Finalmente sólo resta crear una tarea programada por la noche que se encargue de ejecutar nuestro .bat el cual realizará el proceso de compresión y envío.
A continuación detallo el mío:

rem Script graba.bat

Set hora=%time:~0,2%
Set Year=%date:~8,2%
Set Month=%date:~3,2%
Set Day=%date:~0,2%

rem Renombramos los ficheros para tener su fecha en el nombre
cd C:\Documents and Settings\Daniel\Mis documentos\My Recordings
mv Telecinco*.dvr-ms Telecinco%hora%_%Day%_%Month%_%Year%.dvr-ms

cd C:\Archivos de programa\DVRMSToolbox

rem Realizamos conversión a MPEG
DVRMStoMPEG.exe /if="C:\Documents and Settings\Daniel\Mis documentos\My Recordings\Telecinco%hora%_%Day%_%Month%_%Year%.dvr-ms"
/OF="C:\Documents and Settings\Daniel\Mis documentos\My Recordings\Telecinco%hora%_%Day%_%Month%_%Year%.mpg" /act=dvrmstompg

cd C:\Archivos de Programa\DivX\Dr. DivX 2.0 OSS\

rem Realizamos conversión a DivX
cli -i "C:\Documents and Settings\Daniel\Mis documentos\My Recordings\Telecinco%hora%_%Day%_%Month%_%Year%.mpg"
-o "C:\Documents and Settings\Daniel\Mis documentos\My Recordings\Telecinco%hora%_%Day%_%Month%_%Year%.divx"

cd C:\Documents and Settings\Daniel\Mis documentos\My Recordings

rem Copiamos mediante copia segura
scp Telecinco%hora%_%Day%_%Month%_%Year%.divx dani@miserver.homeip.net:"/cygdrive/c/Documents\ and\ Settings/Daniel/Mis\ documentos/Serie/"

echo "TRANSMISIÓN FINALIZADA"

rem Muevo el fichero pesado a la partición donde tengo más espacio
mv Telecinco%hora%_%Day%_%Month%_%Year%.dvr-ms H:\dani\MyRecordings

echo "ARCHIVO DVR-MS MOVIDO AL ALMACEN"


ACTUALIZACIÓN: Super Coco añade en los comentarios como realizar una mejora al sistema, utilizándolo como si de un backup se tratara, utilizando rsync desde cygwin, esto supone una gran mejora con respecto a scp, ya que si scp fallara a mitad de transmisión sería necesario empezar de nuevo el envío.
Así bastaría cambiar en el script la línea de envío donde aparece scp por esta otra:
#la opción --rsh nos permite especificar un puerto de ssh distinto del estandard como necesitaba en mi caso ;-)
rsync -av --partial --stats --progress --delete --rsh='ssh -p1234' dirA dani@alicante:/cygdrive/c/dirB

2 comments:

Super Coco said...

Me ha parecido muy interesante y útil. ¡Qué lástima que no te vaya bien la tarjeta en Linux!

Para la parte de la transferencia de ficheros en sí, yo te recomendaría usar rsync para que si se corta la transferencia a medias, no tenga que empezar desde el principio. Además, podrías tener tus copias sincronizadas con las de ella muy fácilmente sin tener que ir mirando qué fichero quieres transferir. Pones que te sincronice un directorio completo y lo que ya esté allí, no se transfiere...

Yo escribí sobre rsync en: Backups con rsync

Dani said...

Hola super coco! gracias por el comentario, la verdad es que justo después de escribir la entrada, me puse a pensar, ufff y que pasa si se me corta la transmisión.. scp no tiene la capacidad de recordar lo que ha enviado...
Efectivamente la solución es rsync, en cuanto pueda modifico el código ;-)

 

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.