sábado, 19 de junio de 2010

Google admite comandos

Google ha tenido a bien crear googleCL, un script en Phyton para acceder a la funcionalidad de Blogger, Picassa, Calendar, Docs, Youtube.

Lo he probado desde mi Ubuntu 9.10, creando la primera línea de esta entrada:
google blogger post --tags "GoogleCL, Phyton" --title "Google admite comandos" "Google ha tenido a bien crear un script en Phyton para acceder a la funcionalidad de Blogger, Picassa, Calendar, Docs, Youtube."

Tras pulsar enter, te pregunta el nombre de tu cuenta en Google, y te devuelve un URL para que lo valides desde tu navegador.

viernes, 23 de abril de 2010

Cygwin es lento (I)

Pero mucho, mucho.

Lo más lento es ejecutar los configure, que en Unix tardan segundos y en Cygwin minutos.
La razón es la lentísima creación de processos (spawing) en Cygwin.

Por ejemplo, el configure de FFmpeg.

Primero creamos un entorno óptimo, eliminando los directorios innecesarios de PATH:
export TMPDIR=/tmp
export TEMP=/tmp
export TMP=/tmp
export PATH=/usr/local/bin:/usr/bin:/bin


Esta es mi invocación habitual de configure:
time ksh ./configure --disable-shared --enable-static --enable-gpl --enable-avfilter --enable-avfilter-lavf --enable-pthreads --enable-avisynth --enable-bzlib --enable-libmp3lame --enable-libx264 --cc=gcc443 --cpu=core2 --enable-zlib --extra-cflags=-DX_DISPLAY_MISSING

real 2m24.004s
user 0m15.938s
sys 0m41.157s


La cuenta no sale: 2m24s -15s -42s = 86 segundos sin currar.

Primer intento de mejorarlo: evitar las reubicaciones de las DLLs.
Para ello, invocamos la línea de comandos de Windows (cmd.exe), vamos al directorio de los binarios de Cygwin, invocamos dash, y lanzamos rebaseall:
cd c:\cygwin\bin
dash
./rebaseall


Volvemos a invocar el configure de FFmpeg y nos da:

real 2m20.758s
user 0m15.713s
sys 0m42.660s


Bueno, hemos ganado 4 segundos.

sábado, 13 de marzo de 2010

Mi tele lee multimedia (II)

Para las pruebas, necesito material HD, por ejemplo Big Buck Bunny

Nos lo traemos:
wget http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov bbb.mov

FFmpeg nos dice:

ffmpeg -i bbb.mov

Atentos a que partimos de sonido envolvente: los 6 canales de audio.

Convertiremos un trocito, por ejemplo 3 segundos, que a 24 cuadros por segundo, son 72 cuadros.

Empezamos a probar conversiones.

a) Calidad HD.
Los codecs H.264 / AAC encajan con lo que la tele puede leer. El contenedor .mov es un dialecto de .mp4, así que basta con cambiar la extensión de fichero.

Si queremos coger un trocito:
ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec copy -acodec copy bbb_9300.mp4

La tele muestra bbb_9300.mp4 correctamente.

Si los codecs no hubieran coincidido:
ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec libx264 -fpre normal -crf 22 -acodec libfaac -ab 192k bbb_9300.mp4

b) Calidad DVD.
La tele es 16:9, y Big Buck Bunny también, así que mejor usar "-aspect 16:9". Dotaremos de 8000kb/s al vídeo (los DVDs comerciales suelen quedarse en 6000kb/s).

Preparamos las tres variantes de audio.

b1) MPEG layer 2 (sólo estéreo)
ffmpeg -ss 13 -vframes 72 -i bbb.mov -target pal-dvd -aspect 16:9 -b 8000k -ac 2 -acodec mp2 bbb_8000_mp2.vob

b2) LPCM, forzando audio estéreo.
ffmpeg -ss 13 -vframes 72 -i bbb.mov -target pal-dvd -aspect 16:9 -b 8000k -ac 2 -acodec pcm_s16be bbb_8000_lpcm.vob

b3) AC3, preservando los 6 canales.
ffmpeg -ss 13 -vframes 72 -i bbb.mov -target pal-dvd -aspect 16:9 -b 8000k -acodec pcm_s16be bbb_8000_lpcm.vob

La tele los muestra correctamente.

c) Calidad AVI.
Mi tele no necesita la marca "-vtag DX50" que algunos reproductores requieren en Windows.

Preparamos las tres variantes de audio.

c1) MPEG layer 2 (sólo estéreo)
ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec mpeg4 -s 720x576 -aspect 16:9 -b 8000k -ac 2 -acodec mp2 -ab 192k bbb_8000_mp2.avi

c2) MPEG layer 3 (sólo estéreo)
ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec mpeg4 -s 720x576 -aspect 16:9 -b 8000k -ac 2 -acodec libmp3lame -ab 128k bbb_8000_mp3.avi

c3) AC3, preservando los 6 canales.
ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec mpeg4 -s 720x576 -aspect 16:9 -b 8000k -acodec ac3 -ab 384k bbb_8000_ac3.avi

La tele los muestra correctamente.


Conclusión:
La tele da bastante de sí: muy pocos reproductores de salón soportan 8000kb/s en MPEG4. Y menos aún, H.264/AAC.


Líneas de investigación:
El fichero de partida tiene 23.97 fps (FILM). Hay que ver si la tele soporta 29.97fps (NTSC) y 25fps (PAL).
Lo más probable es que sí, pero he notado que el movimiento con 23.97fps es a saltitos, no es suave.

Hay que probar con distintos tamaños. En AVI he visto que 720x432, 704x298, 640x272, 720x400, 640x480 van bien.

Hay que probar si traga tal cual el .mp4 de YouTube HD (1280x720, 640×360).

El fabricante dice que la tele lee particiones FAT16, FAT32 y NTFS. Leer NTFS es inusual, así que hay que refrendrarlo con una pruebecilla.

domingo, 27 de diciembre de 2009

Mi tele lee multimedia

Como indica su fabricante, mi tele lee estos formatos:





























ExtensiónVídeoTamañoKilobits/sAudio
.aviMPEG-4 SP
MPEG-4 ASP
352×288
720×576
384
8000
MPEG layer 2/3
AC3
.mpg
.mpeg
.vob
MPEG-1
MPEG-2
352×288
720×576
1500
9800
MPEG layer 2
LPCM
AC3
.mp4H.264, L2-CIF
H.264, L4-HD
352×288
1920×1080
2000
20000
AAC-LC
AAC-LC

Los tamaños y tasas de bits los he mirado en MPEG-4, y H.264

Me falta hacer una chuleta con las opciones que hay que pasar a FFmpeg para generar estos formatos.

Y probarlos, claro.

viernes, 18 de diciembre de 2009

RCX

Tras profunda exploración del trastero, he re-encontrado mi Robotics Invention System 1.5.
Dentro de esta caja, está el RCX, que es un "ladrillo" amarillo que aloja un microcontrolador con sensores y salidas.

Fue mi regalo de cumpleaños del 2000 o 2001 y me he llevado la desagradable sorpresa de que Lego quitó todas la referencias de su web oficial allá por 2008.

Así que he tenido que ir escarbando:

http://brickos.sourceforge.net/index.html

http://www.mapageweb.umontreal.ca/cousined/lego/

http://www.crynwr.com/lego-robotics/

El RCX se comunica por infrarrojos, pero se habla con los PC a través de una cajita intermedia unida por el puerto serie. El puerto infrarrojo de muchos portátiles no vale, porque Lego usa un protocolo rarito.

Los que tengan un Palm, sí que pueden comunicarse por infrarrojos con el RCX.

domingo, 25 de octubre de 2009

Compilar para Windows desde Ubuntu (II)

En vez de traernos los ejecutables necesarios para la compilación cruzada, podemos traernos los fuentes, y compilarlos.
La ventaja es que podemos tener la última versión, y compilarlos para exactamente la CPU que tengamos (en mi caso, CFLAGS=-march=pentium-m).

Adaptado de la receta de Ramiro.

Nos instalamos algunas dependencias de gcc:
sudo apt-get install flex bison

Algunas dependencias de FFmpeg.
sudo apt-get install texinfo yasm subversion

Y un entorno para poder testear los ejecutables de Windows, sin salir de Linux:
sudo apt-get install wine

Nos preparamos un directorio para bajarnos y compilar el código fuente:
cd "$HOME"
mkdir src
export BASE_PATH="$HOME/src"


Traemos estos ficheros, y los dejamos en el directorio $BASE_PATH:
binutils-2.20.tar.bz2
gcc-core-4.2.4.tar.bz2
mingwrt-3.16-mingw32-dev.tar.gz (from http://sourceforge.net/projects/mingw/files/ under "MinGW Runtime")
w32api-3.13-mingw32-dev.tar.gz (from same site as above under "MinGW API for MS-Windows")
zlib-1.2.3.tar.gz (from http://prdownloads.sourceforge.net/libpng/ )
bzip2-1.0.5.tar.gz (from http://bzip.org/downloads.html )

El compilador cruzado lo instalamos en /usr. Pondrá su cosillas en /usr/bin/i686-mingw32*, sin machacar las del compilador nativo de Ubuntu (que son /usr/bin/i486-linux-gnu*).

Importante:
sudo ln -s /usr/i686-mingw32 /mingw

binutils:
cd "$BASE_PATH"
tar xfvj binutils-2.20.tar.bz2
cd binutils-2.20
mkdir build
cd build
../configure --target=i686-mingw32 --disable-werror --disable-nls --prefix=/usr
make
sudo make install


"runtime" de MinGW:
cd "$BASE_PATH"
sudo tar zxfv mingwrt-3.16-mingw32-dev.tar.gz -C /mingw
sudo tar zxfv w32api-3.13-mingw32-dev.tar.gz -C /mingw


compilador de C:
cd "$BASE_PATH"
tar xfvj gcc-core-4.2.4.tar.bz2
cd gcc-4.2.4
mkdir build
cd build
CFLAGS=-march=pentium-m ../configure --target=i686-mingw32 --disable-nls --prefix=/usr
make
sudo make install


En los entornos GNU, la manera de indicar que queremos usar compilación cruzada, en vez de nativa, es a través de las variables de entorno:
RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc

Compilamos para MinGW algunas bibliotecas de funciones:

zlib:
cd $BASE_PATH
tar zxfv zlib-1.2.3.tar.gz
cd zlib-1.2.3
CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR="i686-mingw32-ar rc" CC=i686-mingw32-gcc ./configure --prefix=/mingw
make
sudo make install


bzip2:
cd "$BASE_PATH"
tar zxfv bzip2-1.0.5.tar.gz
cd bzip2-1.0.5
make libbz2.a CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc
sudo cp bzlib.h /mingw/include/
sudo cp libbz2.a /mingw/lib/


Y con esto ya podemos compilar un FFmpeg para MinGW. Aquí la compilación cruzada se indica con --cross-prefix=i686-mingw32- --target-os=mingw32 y la CPU con --arch=pentium-m --cpu=pentium-m:
cd "$BASE_PATH"
mkdir ffmpeg
cd ffmpeg
svn co svn://svn.ffmpeg.org/ffmpeg/trunk svn
mkdir build-win32
cd build-win32
../svn/configure --enable-memalign-hack --cross-prefix=i686-mingw32- --target-os=mingw32 --arch=pentium-m --cpu=pentium-m


Y os preguntaréis, ¿por qué no compilar para MinGW desde MinGW?. Pues porque es más lento. Pero no un poco, sino algo exagerado: diez veces más lento.

martes, 20 de octubre de 2009

Compilar para Windows desde Ubuntu (I)

Tres pasos para crear un entorno en Ubuntu que nos permita compilar para Windows.

Nos traemos el paquete básico para compilar:
sudo apt-get install build-essential

El compilador cruzado, binutils y el "runtime":
sudo apt-get install mingw32 mingw32-binutils mingw32-runtime

Y un entorno para poder testear los ejecutables que compilemos:
sudo apt-get install wine

Podemos intentar compilar FFmpeg:
configure --enable-memalign-hack --cross-prefix=i586-mingw32msvc- --target-os=mingw32 --arch=i686 --cpu=i686

Pero nos da este error:
ERROR: MinGW runtime version must be >= 3.15.

Es que en Ubuntu 9.04 las versiones de los paquetes de compilación cruzada a MinGW son algo antiguas:
dpkg -s mingw32 mingw32-binutils mingw32-runtime |fgrep Version
Version: 4.2.1.dfsg-1ubuntu1
Version: 2.18.50-20080109-1
Version: 3.13-1


FFmpeg tiene la costumbre de exigir la última versión de sus dependencias, con otros programas estos paquetes de Ubuntu nos podrían valer perfectamente.