Etiqueta: receta

Presentaciones de fotos en formato vídeo (slideshows) desde la línea de comandos

Hace ya algunos años apareció en este blog como hacer presentaciones de fotos en formato vídeo. A pesar de que hay muchos programas buenos para editar vídeo en GNU/Linux, esta vez quería tener un proceso sencillo y fácilmente replicable aún a costa de perder un poco de calidad o efectos (como degradado entre imágenes, …).

En este tutorial veremos, sin entrar en muchos detalles (mis conocimientos no dan para ello), una forma muy rápida de crear un slideshow con música usando únicamente el terminal. Como limitante partimos de la base de que todas las imágenes están en el mismo formato (en este caso JPEG)

Las herramientas


sudo apt-get install --install-recommends rename imagemagick ffmpeg

Normalizar los nombres y ordenar las imágenes

El primer paso es ordenar las imágenes poniéndolos un «nombre normalizado» que represente ese orden. En este caso partimos de unas imágenes que ya tienen cierto orden, pero arreglamos las mayúsculas, usamos dos caracteres para los números y ajustamos las del medio.

Cada caso será muy particular pero veamos un ejemplo:


$ cp -r original copia
$ cd copia
$ ls
0.JPG 1_1.JPG 12_1.JPG 13.jpg 15.jpg 17.JPG 19.jpg 20.jpg 22.jpg 24.jpg 26.jpg 28.jpg 2.JPG 31.jpg 4.JPG 6.JPG 8.JPG
10.JPG 11.JPG 12.JPG 14.jpg 16.jpg 18.jpg 1.JPG 21.JPG 23.jpg 25.JPG 27.jpg 29.jpg 30.jpg 3.JPG 5.jpg 7.JPG 9.JPG
$ rename 's/.JPG/.jpg/' *.JPG
$ rename 's/3(\d).jpg/5$1.jpg/' 3*.jpg
$ rename 's/2(\d).jpg/4$1.jpg/' 2*.jpg
$ rename 's/1([2-9]).jpg/3$1.jpg/' 1*.jpg
$ ls
0.jpg 1_1.jpg 12_1.jpg 2.jpg 33.jpg 35.jpg 37.jpg 39.jpg 40.jpg 42.jpg 44.jpg 46.jpg 48.jpg 4.jpg 51.jpg 6.jpg 8.jpg
10.jpg 11.jpg 1.jpg 32.jpg 34.jpg 36.jpg 38.jpg 3.jpg 41.jpg 43.jpg 45.jpg 47.jpg 49.jpg 50.jpg 5.jpg 7.jpg 9.jpg
$ mv 12_1.jpg 31.jpg
$ rename 's/1([0-1]).jpg/2$1.jpg/' 1*.jpg
$ rename 's/([1-9]).jpg/1$1.jpg/' ?.jpg
$ mv 0.jpg 00.jpg
$ mv 1_1.jpg 01.jpg
$ ls
00.jpg 11.jpg 13.jpg 15.jpg 17.jpg 19.jpg 21.jpg 32.jpg 34.jpg 36.jpg 38.jpg 40.jpg 42.jpg 44.jpg 46.jpg 48.jpg 50.jpg
01.jpg 12.jpg 14.jpg 16.jpg 18.jpg 20.jpg 31.jpg 33.jpg 35.jpg 37.jpg 39.jpg 41.jpg 43.jpg 45.jpg 47.jpg 49.jpg 51.jpg

Rotar las imágenes

A pesar de que en la previsualización del explorador de archivos podamos ver todas las imágenes rectas, alguna de ellas puede estar girada. Esto es por qué muchas herramientas usan por defecto los metadatos EXIF de la imagen para rotarlas de la forma lógica.


# las que no tengan un `1` están rotadas
identify -verbose * | grep -E '(Image:|Orientation)'

# Rotarlas. https://stackoverflow.com/a/19475281/930271
# Esto modifica todas las fotos, por lo que mejor usarlo sólo con la que deben
# ser rotadas
mogrify -auto-orient *.jpg

identify -verbose * | grep -E '(Image:(.*)|exif:Orientation: [2-9])'
mogrify -auto-orient 16.jpg
mogrify -auto-orient 45.jpg

Identificar tamaños y «aspect ratio»

Para montar las imágenes en el vídeo debemos investigar sus tamaños y sobre todo la relación de aspecto. El comando identify de ImageMagick nos puede dar la información más relevante y podemos ordenarla por aspect ratio, anchura, …


# https://unix.stackexchange.com/questions/50252

# ordenadas por aspect ratio
$ identify -format "%[fx:w/h] %w %h %M\n" *.jpg | sort -n -k1

1.5 4608 3072 20.jpg
0.75 1944 2592 15.jpg
0.75 2304 3072 16.jpg
0.75 3864 5152 45.jpg
1.33333 1280 960 44.jpg
1.33333 1280 960 46.jpg
1.33333 1280 960 47.jpg
1.33333 2592 1944 13.jpg
1.33333 3072 2304 17.jpg
1.33333 3264 2448 01.jpg
1.33333 3264 2448 14.jpg
1.33333 3264 2448 19.jpg
1.33333 3264 2448 33.jpg
1.33333 4000 3000 43.jpg
1.33333 4000 3000 50.jpg
1.33333 4000 3000 51.jpg
1.33333 4320 3240 18.jpg
1.33333 4608 3456 31.jpg
1.33333 4672 3504 34.jpg
1.33333 4672 3504 35.jpg
1.33333 5120 3840 49.jpg
1.33333 5152 3864 32.jpg
1.33333 5152 3864 37.jpg
1.33472 1280 959 38.jpg
1.33884 2592 1936 00.jpg
1.33884 2592 1936 11.jpg
1.49841 3776 2520 21.jpg
1.77778 3072 1728 12.jpg
1.77778 3264 1836 39.jpg
1.77778 3968 2232 41.jpg
1.77778 5312 2988 36.jpg
1.77778 5312 2988 40.jpg
1.77778 5312 2988 42.jpg
1.77778 5312 2988 48.jpg

# ordenadas por width
identify -format "%[fx:w/h] %w %h %M\n" *.jpg | sort -n -k2

Aquí la clave es:

  • Ajustar las imágenes para que tengan todas la misma relación de aspecto y que no salgan deformadas. Cosa que haremos directamente con ffmpeg al crear el vídeo.
  • Escoger el tamaño de referencia a usar para las imágenes. La «redimensión» la haremos directamente al crear el vídeo.

Sin entender mucho de vídeos mi criterio es coger el aspect ratio más común a las imágenes, en este caso 1.333, y un tamaño intermedio, de modo que haya pocas imágenes por debajo de ese tamaño, y que al ampliar no pixelen demasiado, en este caso me quedo con 2592×1936

Montar el vídeo

La wiki de ffmpeg da el comando básico para hacer el slideshow, y en stackoverflow también hay buenas respuestas

El comando que usaremos en este caso es:


ffmpeg -framerate 1/5 -pattern_type glob -i '*.jpg' -i audio.mp3 -vf 'scale=2592:1936:force_original_aspect_ratio=decrease,pad=2592:1936:(ow-iw)/2:(oh-ih)/2,setsar=1' -c:v libx264 -c:a copy -crf 14 -r 25 -pix_fmt yuv420p -shortest output.mp4

Los parámetros más relevantes para el slideshow:

  • -framerate 1/5: El denominador define cuanto se mostrará cada imagen
  • -pattern_type glob -i '*.jpg': Cuando las imágenes no están ordenadas exactamente de forma secuencial con este parámetro las meterá en el video ordenadas por nombre
  • 'scale=2592:1936:force_original_aspect_ratio=decrease,pad=2592:1936:(ow-iw)/2:(oh-ih)/2,setsar=1': Escala las imágenes a 2592×1936 y mete bandas negras de relleno cuando no se pueda conservar la relación de aspecto

Virtualbox + Windows + VideoConferencia Múltiple en Skype

Si usas linux no sería extraño que alguna vez te hayas encontrado con una ineludible videoconferencia de grupo por Skype y hayas tenido que hacer números para poder participar.

Quien dice Skype, dice alguno de esas extrañas aplicaciones privativas de videoconferencia que alguna gente (clientes) insisten en usar.

Si tienes una licencia de Windows que puedas reusar para una máquina virtual, a mi estas instrucciones me funcionan en Ubuntu 18.04 para poder usar webcam y micro.


# Substituir por el usuario deseado
USER=$(whoami)

sudo apt install virtualbox virtualbox-ext-pack virtualbox-guest-additions-iso virtualbox-guest-x11 virtualbox-dkms
sudo usermod -a -G vboxusers $USER
sudo usermod -a -G video,audio,pulse-access $USER
sudo usermod -a -G audio pulse

Tras crear la máquina guest con Windows:

  • Encender la máquina virtual
  • `Dispositivos ópticos` -> `montar una nueva iso` -> En `/usr/share/virtualbox` seleccionr VBoxGuestAdditions.iso.
  • En caso de que no se ejecute automáticamente el cd/iso, ejecutaremos el .exe desde el explorador de archivos.

Con estas instrucciones tendremos una máquina virtual que soporte webcam, audio, usbs, portapapeles bidireccional (a activar en la configuración de cada máquina), …

Migrar a GitLab manteniendo mirrors en GitHub

En iCarto habíamos planificado hace un tiempo migrar nuestra infraestructura de desarrollo (repositorios de código principalmente) a GitLab. Estos días hemos terminado la migración y he aprovechado para escribir un artículo de como se pueden mantener mirrors de los repos de gitlab en github a través de la propia plataforma o con un servidor intermedio.

Usando GeoProcesos en gvSIG desde Java

La semana pasada había un correo en la lista de desarrollo de gvSIG preguntando como poder lanzar geoprocesos desde tu propio plugin mediante Java. Tras una pequeña investigación he escrito un código de ejemplo que espero que sea útil a quien tenga esta necesidad.

Descargar el código

A mi particularme me gusta descargar el código fuente de las partes de gvSIG con las que voy a trabajar. Esto simplifica el usar las herramientas del IDE para saber como usarlo, encontrar errores, y revisar los tests, en caso de haberlos, para tener pistas de como escribir mi propio código.

Para ello primero se mira la versión del plugin que se corresponda con la versión de gvSIG que estás usando. Creo que lo más fácil es descargar una versión portable de gvSIG. Entrar a la carpeta que contiene el plugin, en este caso org.gvsig.geoprocess.app.mainplugin y abrir el fichero package.info. En la property version está el tag del repo correspondiente a esa versión. Por ejemplo para la 2.3RC2 sería el 2.266. Por tanto para descargar el repo haremos:


svn checkout http://devel.gvsig.org/svn/gvsig-geoprocess/org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.66/

A continuación,e n caso de usar Eclipse, iremos a import -> Existing maven projects, e importaremos la raíz del nuevo plugin descargado.

Añadir las dependencias

Al desarrollar en gvSIG debemos tener en cuenta que las dependencias de nuestro plugin, por decirlo de algún modo, serán de dos tipos. En «Tiempo de desarrollo», y en «Tiempo de ejecución». Las dependencias en desarrollo se definen en el pom del proyecto permitiéndonos definir el classpath de desarrollo para trabajar con las clases que nos hagan falta.

En ejecución, cuando estamos probando o ejecutando gvSIG, el classpath se define de manera dinámica por decirlo de algún modo en el fichero de config.xml. gvSIG buscará entre las dependencias que hayamos definido en el config las clases que se pueden usar en nuestro plugin.

Para que quede claro, a nuestro pom se añadirán otros proyectos maven. A nuestro config se añadirán plugins de gvSIG.

Por ejemplo para el caso de usar los geoprocesos, añadiremos al pom:



org.gvsig
org.gvsig.geoprocess.lib.api
2.2.66


org.gvsig
org.gvsig.geoprocess.lib.sextante
2.2.66

y al config



Obtener el algoritmo que queremos

Esta una de las partes en las que tengo más dudas que esté correcta.

En general accederemos a las funcionalidades de gvSIG a través de un Locator que nos dará un Manager que nos dará la funcionalidad. En el caso de los geoprocesos sería:


String ALG_NAME = "gvSIG-intersection";
SextanteGeoProcessManager manager = (SextanteGeoProcessManager) GeoProcessLocator.getGeoProcessManager();
HashMap algs = manager.getAlgorithms();
GeoAlgorithm alg = algs.get(ALG_NAME);

Debemos castear a la implementación por defecto del manager SextanteGeoProcessManager porque la interfaz en sí no proporciona el método getAlgorithms. Esto diría que es un bug.

La forma de obtener ALG_NAME, no estoy seguro de cual es. En principio lo más fácil sería poner un breakpoint y mirar los valores de algs. Aunque en mi caso sólo salen los propios de gvSIG y no los de Sextante.

Seteando valores al algoritmo

Todos los algoritmos definen un método defineCharacteristics que nos indican los valores que recibe, tanto de entrada como de salida. Esta definición de valores se obtiene a través del método getParameters

En nuestro código debemos obtener cada uno de los parámetros necesarios y setear su valor real para nuestro caso. Por ejemplo:


private void setParams(GeoAlgorithm alg) throws WrongParameterIDException {
ParametersSet params = alg.getParameters();

FLyrVect interLyr = getLayer("inter");
FlyrVectIVectorLayer inter = new FlyrVectIVectorLayer();
inter.create(interLyr);

FLyrVect layerLyr = getLayer("layer");
FlyrVectIVectorLayer layer = new FlyrVectIVectorLayer();
layer.create(layerLyr);

params.getParameter(IntersectionAlgorithm.INTER).setParameterValue(
inter);
params.getParameter(IntersectionAlgorithm.LAYER).setParameterValue(
layer);
params.getParameter(IntersectionAlgorithm.SELECTGEOM_INPUT)
.setParameterValue(false);
params.getParameter(IntersectionAlgorithm.SELECTGEOM_OVERLAY)
.setParameterValue(false);
}

En este caso para no escribir a mano los idenfificadores de los parámetros uso las variables estáticas definidas en el propio algoritmo. Eso hace que haya que añadir al pom el algortimo:



org.gvsig
org.gvsig.geoprocess.algorithm.intersection
2.2.66

Para las capas de entrada al algoritmo hay que generar una FlyrVectIVectorLayer. Como se muestra en el código de ejemplo lo más sencillo es obtener un FLyrVect y construirla con el create.

Ejecutando el algoritmo

Los algoritmos se lanzan mediante el método execute que como indica la documentación admite hasta tres parámetros.

  • ITaskMonitor task. Que puede ser nulo y permite monitorizar el estado para por ejemplo poner una barra de progreso al usuario
  • HashMap outputMap. Que permite modificar los nombres que sextante asigna a los parámetros de salida (en general capas)
  • OutputFactory outputFactory. Define como se crearán los objetos de salida. Puede ser nuestra propia implementación o usar la factoría por defecto

Por tanto ejecutarlo sería simplemente:


alg.execute(null, new DefaultOutputFactory(), null);

Obteniendo los resultados

Con la factoría por defecto las capas se crean en un directorio temporal que en linux es /tmp/tmp-andami y les asigna nombres aleatorios (creo que basados en el timestamp). Supongo que habrá alguna utilidad que nos permite ejecutar una especie de FinalActions para añdirlos automáticamente a la vista. O implementando nuestra propia OutputFactory podríamos definir otras rutas. También diría que podemos prescindir del OutputFactory y lanzar el algoritmo mediante processAlgorithm si igual que hicimos con los parámetros de entrada seteamos adecuadamente los valores de salida, especialmente el OutputChannel de las capas.

En todo caso el método getOutputObjects nos devuelve los objetos de salida, así por ejemplo podríamos llegar el FlyrVectIVectorLayer de la capa de polígonos de salida con:


OutputObjectsSet outputSet = alg.getOutputObjects();
OutPut output = outputSet.getOutPut(IntersectionAlgorithm.RESULT_POL)
FlyrVectIVectorLayer result_pol = (FlyrVectIVectorLayer) output.getOutputObject();

Si el disco duro no para al arrancar ubuntu vacía la papelera

Los discos duros (casi) infinitos actuales han hecho que en un año haya acumulado más de 4000 ficheros y casi 60GB en la papelera de Gnome. Nunca pensé que esto fuera un problema pero ultimamente el ordenador tardaba muchísimo en iniciarse y el disco duro incluso después de arrancar el escritorio estaba funcionando durante uno o dos minutos.

El comando iotop nos permite saber que procesos están consumiendo más acceso a disco, y al lanzarlo durante el arranque descubrí que el problema era el servicio gvfsd-trash, responsable de la gestión de la papelera. Hay un montón de bugs y comentarios en los foros quejándose de este problema [1], [2], [3].

A falta de una solución mejor simplemente vaciar la papelera funciona. Así que ya sabes, si la lucecita del disco duro no para durante el arranque vacia la papelera.

Un sistema como otro cualquiera para recuperar tus contactos en un Android con la pantalla rota

Uno de esos días cualquiera en que te llega alguien (a quien no puedes mandar a freír puñetas buscar en google) que una semana después de comprarse su primer móvil con Android se le ha caído al suelo, se le ha roto la pantalla y quiere recuperar sus contactos.

La primera respuesta es fácil. No hay problema, estarán en la memoria de la tarjeta, o sincronizados en la cuenta de google. Pero no, ni uno ni otro. Están en la memoria del teléfono.

Las primeras búsquedas en google se refieren a sistemas que necesitan que el teléfono esté rooteado para por ejemplo copiar la base de datos (sqlite) con los contactos. Teniendo el sqlite es fácil sacar un csv o al menos un listado que copiar a mano. Pero por supuesto el teléfono no está rooteado.

Bueno, la pantalla no está del todo muerta, la parte de arriba responde. Así que igual da para hacer pulsar en los sitios clave. El teléfono en sí no puede desbloquearse, pero si se puede llegar al botón de «Ajustes«, porque no tiene activado la protección por figura. Jugando con la rotación automática para modificar los sitios a pulsar, podemos llegar de «Ajustes» a «Aplicaciones«, de ahí a la pestaña de «Todas» y desplazarnos hasta «Contactos«. Muchas de las apps, como la «Contactos» tienen un botón «Lanzar» equivalente a como si las abrieras desde el Launcher.

Estando en la app de Contactos sólo hay que poder lanzar la opción de «Exportar«, pero en este teléfono ese menú se lanza desde la tecla de «Menu» que no responde. Teóricamente con el conector adecuado, podríamos conectar un ratón al teléfono para controlarlo, pero a falta de conector resulta que es posible enviar eventos (como pulsaciones de teclas) al móvil a través de adb.

«Pulsamos» la tecla de menú:


$ ./adb shell input keyevent 82

Y un par de veces KEYCODE_DPAD_DOWN que actúa como el curso hacia abajo


$ ./adb shell input keyevent 20

Y enviamos el evento KEYCODE_DPAD_CENTER para hacer click / pulsar / tap sobre la opción seleccionada


$ ./adb shell input keyevent 23

Y ya tenemos lanzada la la aplicación de exportación. Siguiendo un proceso parecido de ver en que partes de la pantalla de puede pulsar y enviando eventos desde adb, seleccionamos como origen el smartphone, como destino la cuenta de gmail. Y listo. En un par de minutos tenemos los contactos en gmail, desde donde podemos exportarlos a csv, vcard o listos para ser usados desde otro teléfono android.

Espero que a alguien le sea de ayuda. Se admiten otros modos de hacerlo en los comentarios.

Compilando y depurando un plugin de ejemplo para gvSIG 2.1 desde Eclipse

Joaquín del Cerro ha publicado un artículo explicando como compilar y depurar un plugin de ejemplo para gvSIG 2.1 con NeatBeans. He adaptado sus instrucciones para Eclipse que es mi IDE habitual. Este artículo no es tan detallado como el suyo así que seguramente tendrás que consultar los dos, especialmente los pasos previos que comenta Joaquín para que todo funcione.

Una vez que tenemos los «previos» realizados, creamos un nuevo workspace en eclipse, por ejemplo workspace-gvsig-landregistry.

Nos aseguramos de que tenemos instalados en eclipse:

Abrimos la perspectiva de eclipse de SVN Repository Exploring, desde Window -> Open perspective -> Other, o cualquier otro de los sitios desde los que se puede abrir.

Y añadimos el repositorio del plugin desde File -> New -> Repository Location o el icono correspondiente. Como URL usaremos:

http://devel.gvsig.org/svn/gvsig-plugintemplates/org.gvsig.landregistryviewer/trunk/org.gvsig.landregistryviewer/

Seleccionamos el repositorio que acabamos de añadir y en el menú contextual escogemos Check out as maven project

Si no tenemos el conector de maven-svn instalado, nos pedirá instalarlo. En la ventana previa al checkout nos aseguraremos de que la opción «All projects» está activada

Puede tardar un ratito en descargar, sobre todo si tiene que descargar muchas dependencias. Cuando acabe, pasamos a la perspectiva Java y ya tendremos los proyectos correspondientes al plugin configurados en el workspace.

Si no tienes la opción de Build automatically activada, haz un build all. A continuación pon un punto de ruptura para comprobar que todo funciona correctamente en el punto que indica Joaquín (método createWindow de la clase LandRegistryViewerExtension).

Tras lanzar gvSIG en modo debug,


./gvSIG --debug --pause

configuramos el debugger. En Debug Configurations, añadiremos una nueva configuración del tipo Remote Java Application

En name pondremos lo que queramos, por ejemplo org.gvsig.landregistryviewer.app, en project org.gvsig.landregistryviewer.app.mainplugin y en port 8765. Si antes de crear la configuración de debug seleccionamos el proyecto org.gvsig.landregistryviewer.app.mainplugin en el package explorer nos rellenará automáticamente name y project.

Al darle a debug debería abrirse gvSIG y pararse la ejecución en el punto que hemos marcado.

Mover un torrent de transmission a otro ordenador

Una nota rápida para explicar como mover una descarga (completa o incompleta) de transmission a otro ordenador.

El escenario es sencillo, tengo los torrents divididos entre dos ordenadores, y se dió el caso de que quería mover uno de los torrents de uno de los ordenadores al otro. Mover toda la información de transmission de un ordenador a otro es sencillo, basta mover los ficheros descargados a la misma ruta en el otro ordenador, y copiar la carpeta ~/.config/transmission. Mover sólo uno es parecido, simplemente hay que ser un pelín más cuidadoso.

  1. Copiar del ordenador 1 a un almacenamiento temporal o similar los ficheros relacionados con nuestro torrent:
    • El fichero .resume en ~/config/transmission/resume
    • El .torrent en ~/config/transmission/torrent
    • El propio fichero descargado, si está incompleto da igual, reanudará la descarga desde el punto correcto.
    • Anotar la cantidad de datos descargados y enviados para ese fichero
  2. Abrir transmission en el ordenador 2 y abrir el .torrent del ordenador 1. Preferiblemente agregarlo en modo pausa para que no comience la descarga automáticamente
  3. Copiar a la ubicación del ordenador 2 donde se descargará el fichero, el fichero del ordenador 1
  4. En transmission, botón derecho sobre el torrent pausado, y «Verificar datos locales«.

Con esto estaría listo, pero si somos un poco más quisquillosos con las estadísticas y las opciones tenemos que efecutar un par de pasos más.

  1. Cerrar transmission en el ordenador 2
  2. Copiar el .resume del ordenador 1 al directorio adecuado en el ordenador 2
  3. Abrir con un editor de texto el fichero ~/config/transmission/stats.json y actualizar los valores de downloaded-bytes y uploaded-bytes

stats.json guarda las estadísticas de ejecución del programa, para actualizar los valores de interes simplemente multiplicaremos las megas descargadas/subidas por 1048576 (1024×1024) para pasar de megas y bytes y lo sumaremos a los valores que ya tenían.

Si es sólo para mover un fichero este procedimiento está bien, si es para mover más habría que hacer un script.

Referencias

 

Canciones de Karaoke a partir de vídeos del Youtube

Llegan las fechas navideñas, lo que implica fiestas hogareñas y con ello, los amantes del Karaoke se vuelven más exigentes. Como hacer para quitar la voz a uno de esos vídeos de Youtube creados en plan Karaoke. Hagamos un ejemplo con En El mundo genial de las cosas que dices de Maldita Nerea. Si te gusta el disco y lo compras a través de este enlace
yo me llevo un porcentaje que motiva a seguir escribiendo ;).

El primer paso es buscar en youtube o similar un vídeo donde alguien se haya molestado en añadir la letra a la canción. Buscando en el propio youtube el título de la canción + karaoke se encuentran muchos, por ejemplo este.

A continuación descargaremos el vídeo, hay muchas formas de hacerlo, pero una de las más sencillas es a través de keepvid. Llega con poner la dirección del vídeo que queremos descargar, y aceptar la ejecución del applet de java. Pasado un ratillo nos dará la opción de descargar el vídeo en varios formatos. Cualquiera de los formatos es válido, en este ejemplo usaremos MP4.

Para quedarnos con el audio de la canción usaremos la línea de comandos por ser lo más sencillo. Aunque también se puede hacer de forma gráfica.

ffmpeg -i fichero_original.mp4 -acodec copy audio.aac

Para tratar de eliminar la voz del cantante de la parte instrumental del canción usaremos Audacity. Hay varios tutoriales por ahí, tanto usando el efecto vocal removal como un poco más manual. Como este proceso es muy rápido y sencillo, prueba los dos procedimientos y quedate con el que tenga más calidad. La voz no es completamente eliminada pero si se reduce bastante. Podemos exportar el audio al formato que queramos, ya que el original estaba en AAC, lo exportaremos a este.

Para recombinar audio y vídeo, volvemos a usar la línea de comandos. Con la siguiente orden le estamos diciendo que coja el audio del fichero audio_sin_voz.aac, lo mezcle con el vídeo del fichero original (el audio original será descartado automáticamente) y producirá un nuevo vídeo de salida respetando los codecs originales.

ffmpeg -i audio_sin_voz.aac -i fichero_original.mp4 -vcodec copy -acodec copy Maldita_Nerea-El_mundo_genial_de_las_cosas_que_dices.mp4

Puedes ver como queda en mi youtube.

Si el liferea tarda mucho en arrancar…


$ eatmydata liferea

Liferea es un lector de feeds (como google reader, pero en aplicación de escritorio) libre que cumple su cometido. La verdad es que no me parece la aplicación definitiva para leer rss pero funciona.

Eso si, tiene un error enormemente molesto y es lo lento que es cuando arranca, sincroniza feeds o marcas toda una carpeta como leída.

Simplificando un poco, lo que está pasando es que el objetivo principal de los sistemas de ficheros modernos es evitar la pérdida accidental de información, de modo que se sacrifica rendimiento (y la duración del disco duro) ante problemas hipotéticos como el de que se vaya la corriente y el ordenador se apague de manera brusca. Por defecto, sqlite, que es la base de datos que emplea Liferea, pide muy a menudo al sistema operativo que se asegure de que la información que gestiona el programa está guardada en el disco duro. Es decir, cuando un programa quiere guardar algo en el disco duro, pide al sistema operativo que lo guarde, pero esto no tiene porque suceder de manera inmediata (se dice que la escritura es asíncrona). El sistema operativo puede mantenerlo en la RAM hasta que considera que es el momento idóneo de escribirlo en disco. Pero las aplicaciones también tienen la opción de forzar al sistema operativo a que los datos sean escritos (sincronizar), y está opción de forzar es lo que usa liferea tan a menudo.

Como este problema no es exclusivo de liferea si no que sucede en muchas aplicaciones, un desarrollador de debian, ha escrito un programa llamado eatmydata que permite desactivar las funciones de sincronización del sistema operativo para aquellos programas que nos interesen. De modo que si un programa ejecutado bajo el paraguas de eatmydata pide forzar el sincronizado, no sucederá nada, esa orden será ignorada. En general esto no es peligroso, pero hay que tener cuidado de cuando se usa y no hacerlo nunca con aplicaciones críticas. Con liferea haciendo copias de seguridad de vez en cuando no hay problema. Para instalar eatmydata llega con:

sudo apt-get install eatmydata

y para ejecutar un programa bajo eatmydata

eatmydata nombre_del_programa