Captura de un frame de un vídeo
1 Abril, 2006
Hoy se me ha planteado un problema, debía obtener una captura en un formato válido para web (jpg, png, gif) de un vídeo cualquiera, ya sea avi, wmv, mov de forma automatizada, es decir, yo le paso a un programa el nombre del vídeo y saca el screenshot.
Recordaba que mplayer permitía muchos formatos de salida de vídeo, fbdev, x11, sdl… y también recordaba haber visto jpeg. Así que voy a confirmarlo…
mplayer -vo help
Y soporta todos los formatos mencionados (jpg, gif, png) y otros como tga. Ahora, si me permite indicarle una posición para empezar a reproducir y que reproduzca sólo un frame, ya lo tengo todo solucionado.
La opción para indicar dónde comenzar a reproducir es “ss” y para capturar un sólo frame se puede hacer con el parámetro “frames” así que ya lo tengo:
mplayer video.avi -ss 60 -frames 1 -vo jpeg
Esto captura un frame del “video.avi” en el segundo 60 y lo guarda como 0000001.jpg
Ahora puedo llamar a este comando desde cualquier lenguaje de programación y obtener fácilmente un screenshot del vídeo.
Zenity, aplicaciones gráficas en 5min
28 Marzo, 2006
Necesitas realizar una pequeña aplicación, algo sencillo, un par de cuadros de diálogo, una ventana de selección de ficheros, selección de fecha a través de un calendario o una simple notificación, pero… necesitas un montón de bibliotecas según el sistema que uses (GTK, QT, WxWidgets, …), configurar el entorno, inicializarlas librerías …; todo eso son varias líneas de código, y te echan para atrás, pero la solución es mucho más fácil de lo que parece y se llama Zenity.
Instala Zenity (apt-get install zenity en debian), coge tu lenguaje de programación favorito, scripting para ir más rápido (PHP, Perl, Python, Ruby, bash…), realiza tu aplicación y haz llamadas a zenity cuando necesites algún elemento gráfico sencillo.
Voy a hacer un pequeño ejemplo con PHP, una aplicación que pida nombre, fecha de nacimiento e indique la edad actual del usuario:
$nombre = `zenity --entry --text="Introduce tu nombre:"`;
list($dia,$mes,$anyo) = explode("/",`zenity --calendar --text="$nombre, selecciona tu fecha de nacimiento" --date-format="%d/%m/%Y"`);
list($adia,$ames,$aanyo) = explode("/",date("d/m/Y"));
$edad = $aanyo-$anyo;
if($mes > $ames) {
$edad--;
} else if($mes == $ames) {
if($dia > $adia) { $edad--; }
}
`zenity --info --info-text="$nombre, tienes $edad años"`;
En este caso, las partes importantes del script son las llamadas a zenity, estas llamadas podemos hacerlas directamente en consola, si queremos probar. Por ejemplo, puedes escribir en una consola:
zenity –entry –text=”Introduce tu nombre”
Si guardas el código como zenitytest.php sólo tienes que hacer php -f zenitytest.php y empezará a ejecutarse.
Aquí tienes unas imágenes de la ejecución del script:
Doctor, me inyectan código
24 Marzo, 2006
Ayer un amigo me comentaba que nada más entrar en el trabajo su jefe le abroncó, me explicó que su código ASP (vbs) era vulnerable a inyecciones SQL, y tenía que solucionarlo.
Una inyección SQL se da cuando el código que maneja la consulta no es lo suficientemente sólido y permite manipular una consulta desde fuera. Por ejemplo:
SELECT * FROM tabla WHERE id = ” & ide & “
Basta con que el atacante abra la url de esta forma url.php?ide=1;DROP TABLE tabla; para cargarse toda la tabla, así de fácil.
Como solución le propuse convertir esa variable a entero, usando cint, ide = cint(ide), de esa forma nunca podría colarse otra cosa que no fuese un número.
En el caso de las cadenas, la solución está en “escapar” las comillas, con un simple Replace(cadena,”‘”,”””)
Hay soluciones mucho mejores para estos problemas, como usar parametrización de consultas, ADODB lo soporta, lo explican en su documentación.
Otra solución también bastante efectiva es la de PHP, que tiene activadas las magic_quotes por defecto y escapea cualquier parámetro que venga de GET o POST, evitando muchos de estos ataques.


