miércoles, julio 17, 2013

Editando vídeos desde la consola de GNU/Linux

Supongamos que partimos de un vídeo en formato DV (formato sin compresión habitual en las cámaras de vídeo) con la grabación completa y deseamos un fragmento. Por lo tanto, lo primero será reproducirlo para ver en que instantes de tiempo vamos a realizar los cortes. Tendremos que anotar el tiempo en que se inicia y la duración del fragmento que deseamos, todo en segundos.

Para extraer el fragmento se puede utilizar la herramienta avconv  de audio y vídeo del proyecto Libav, es un proyecto de software libre para la manipulación de datos multimedia.

Su instalación en Ubuntu es muy sencilla:
sudo apt-get install libav-tools


Para trocear un vídeo utilizaremos:

avconv -i video.dv -vcodec copy --ss <inicio-en-segundos> -t <duración-en-segundos> -acodec copy trozo.dv


Probablemente el fragmento de vídeo en formato DV ocupe mucho espacio, puede ser interesante reducir su peso y perder la menor calidad posible, para ello una buena opción puede ser el codec de vídeo H.264/MPEG-4 AVC.

Convertir un vídeo a ffv1 y pcm_s16le para preservación:
avconv -vsync passthrough -i trozo.dv -vcodec ffv1 -g 1 -acodec pcm_s16le -map 0:v -map 0:a trozo.mkv


Convertir un vídeo a H.264/MPEG-4 AVC:

avconv -i trozo.dv -vcodec libx264 trozo.mp4

También nos puede interesar convertir el video a WebM, un formato de audio y vídeo diseñado libre de royaltis para su utilización en HTML5,  el proyecto está respaldado por Google.

Convertir un vídeo a WebM:

avconv -i trozo.dv trozo.webm

En algunas ocasiones nos podemos encontrar que el vídeo sólo tiene un canal de audio grabado, es decir, sólo escuchamos el sonido por uno de nuestros altavoces. Para poder solucionarlo podemos utilizar la herramienta Sound eXchange (SoX), un editor de audio desde la línea de comandos publicado con licencia GNU por Chris Bagwell.

Primero habrá que extraer el audio del fragmento de vídeo, para ello haremos uso nuevamente de la herramienta avconv y lo pasaremos al formato FLAC (Free Lossless Audio Codec), FLAC es un codec de audio de baja compresión sin perdida de información, a diferencia de MP3.
FLAC es un formato abierto y libre de royaltis, soporta metadatos, posicionamiento rápido y almacenar la imagen de portada.

Extraer el audio de un vídeo:
avconv -i trozo.mp4 -f flac audio.flac

Unir varios vídeos en uno:mencoder -oac copy -ovc copy -o final.VOB trozo1.VOB trozo2.VOB

Duplicar el audio de un canal en el otro y aumentar el volumen al doble:
sox -v 2.0  audio.flac audio-completo.flac channels 1

Sox nos avisará en el caso que el aumento del volumen produzca saturación del canal, indicando el número de ondas que se han recortado en la operación. Un ejemplo de esta situación: sox WARN sox: `audio.flac' balancing clipped 638 samples; decrease volume?

Ahora toca incorporar el nuevo audio al trozo del vídeo del cual lo obtuvimos. Para ello utilizaremos avconv, donde le facilitaremos como flujo de vídeo (-i trozo.mp4) el trozo de vídeo del que partíamos y como flujo de audio (-i audio-completo.flac) el audio con el canal duplicado. También hay que indicarle a avconv que el codec de vídeo sea H.264/MPEG-4 AVC (-vcodec libx264):

avconv -i trozo.mp4 -i audio-completo.flac -map 0:0 -map 1:0 -vcodec libx264  trozo-final.mp4

En algunas ocasiones nos puede solicitar avconv un bit rate, en ese caso se lo podemos indicar de la siguiente forma para uno de 640kb/s:


avconv -i trozo.mp4 -i audio-completo.flac -map 0:0 -map 1:0 -vcodec libx264 -ab 640k trozo-final.mp4



Para duplicar el audio de varios vídeos se puede utilizar el siguiente script en python:


#!/usr/bin/python
import sys, os
 
for i in range(1,len(sys.argv)):
    fichero= str(sys.argv[i])
    fichero_salida="%s-st.%s" % (fichero.rsplit(".",1)[0],fichero.rsplit(".",1)[1])
    os.system("avconv -i %s -f flac kk.flac" % fichero)
    os.system("sox -v 2.0  kk.flac kk2.flac channels 1")
    os.system("avconv -i %s -i kk2.flac -map 0:0 -map 1:0 -vcodec libx264  %s" % (fichero,fichero_salida))
    if os.path.exists("kk.flac"):
      os.remove("kk.flac")
    if os.path.exists("kk2.flac"):
      os.remove("kk2.flac"
 
 
El script espera que le facilitemos los vídeos a procesar como argumentos, y los convertirá a vídeos con el codec H.264/MPEG-4 AVC, el sonido en los dos canales y con el volumen duplicado.

Rotar un vídeo 

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4
  

Capturar la pantalla en vídeo (screencast)
Tenemos que indicarle a avconv que tome la fuente del servidor Xorg (-f x11grab): avconv -f x11grab -s 1366x768 -r 25 -i :0.0 -same_quant video.mp4

viernes, julio 12, 2013

Creando y manipulando PDFs desde la consola de Linux

Para reducir el peso de un documento PDF podemos utilizar Ghostscript:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=final.pdf inicial.pdf


en lugar de /ebook podemos utilizar también:
  • /screen una resolución más baja.
  • /printer una resolución de calidad para impresión.
  • /prepress  una resolución de calidad para pre-impresión.
  • /default la resolución original.

También se puede utilizar la siguiente combinación de ordenes, pero no respeta el texto seleccionable en sengundo plano resultante de aplicar OCR sobre una imagen digitalizada:

pdf2ps inicial.pdf kk.ps
ps2pdf kk.ps final.pdf



Conversión de imágenes a PDF mediante la aplicación ImageMagick, partimos de imágenes en formato jpeg enumeradas consecutivamente, el tamaño del documento será de 1000x1374 pixeles por página:

convert *.jpg -page 1000x1374 -adjoin fichero.pdf


Conversión de un fichero PDF de texto a PDF de imágenes:

pdf2djvu -i salida.djvu mifichero.pdf
djvups salida.djvu temporal.ps
ps2pdf temporal.ps mificherodeimagenes.pdf

Conversión de imágenes TIFF a un documento PDF:

tiff2ps *.tiff | ps2pdf -sPAPERSIZE=a4  salida.pdf

Extraer imágenes de un PDF, (-j en formato jpg, -f   página inicial, -l página final):


pdfimages -f 1 -l 1 -j fichero.pdf imagenes

jueves, julio 11, 2013

Evitar la selección de texto en las páginas web

Mediante la hoja de estilos podemos desactivar la selección de texto de una sección de nuestra página web, por ejemplo para el siguiente fragmento de una página web:

<div id="mitexto" class="sinseleccion"> texto no seleccionable</div>

en la hoja de estilos correspondiente a esta página web indicaremos:

.sinseleccion{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
  -o-user-select:none;
  -ms-user-select:none;

}

jueves, julio 04, 2013

Configuración de un punto de Información o kiosko con Ubuntu Linux.

Partiremos de una instalación de Ubuntu 13.04 y será necesario instalar los siguientes paquetes:

sudo apt-get install openssh-server 
sudo apt-get install lxde

Configurar la red, editar el fichero /etc/network/interfaces y añadir la siguiente información con los datos de nuestra red:

auto eth0
iface eth0 inet static
address 192.168.0.162
netmask 255.255.255.0
gateway 192.168.0.1

dns-nameserver 8.8.8.8


Esta configuración de red nos permitirá acceder al punto de información mediante el servidor sshd para gestionar el equipo.

Establecer lxde por defecto:

sudo update-alternatives --config x-session-manager

Ahora creamos el usuario kiosko:

sudo adduser kiosko

Crear el fichero .xinitrc de sólo lectura en la carpeta personal del usuario kiosko, para evitar la activación del salva pantallas y además se lance lxde:


xset s off &
xset -dpms &

exec startlxde

 
Editar el fichero /etc/xdg/lxsession/LXDE/autostart  y desactivar todas las aplicaciones que se inician automáticamente, mi fichero ha quedado así:

#@xscreensaver -no-splash
#@lxpanel --profile LXDE
#@pcmanfm --desktop --profile LXDE
#@/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1


Instalar el complemento R-kiosk para firefox, disponible en https://addons.mozilla.org/en-US/firefox/addon/r-kiosk/

Crear el fichero /home/kiosko/.config/lxsession/LXDE/autostart que lanzará de forma automática el navegador web con la información que deseamos mostrar en nuestro punto de información:

@firefox file:///home/kiosko/index.html


Desactivar las combinaciones de teclas, editando el fichero /home/kiosko/.config/openbox/lxde-rc.xml y cambiar los permisos a sólo lectura para el usuario kiosko.


Desactivar los terminales de texto. La mayoría de las distribuciones de GNU/Linux traen activos varios terminales de texto que se pueden acceder con la combinación de teclas ctr+alt+F1 hasta ctr+alt+F6. Por lo que editaremos como root los ficheros  /etc/init/ttyX.conf, donde X corresponde al número del terminal (1 al 6) y comentaremos las líneas (ejemplo del tty1.conf):

# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.

#start on stopped rc RUNLEVEL=[2345] and (
#            not-container or
#            container CONTAINER=lxc or
#            container CONTAINER=lxc-libvirt)

#stop on runlevel [!2345]

#respawn
#exec /sbin/getty -8 38400 tty1


Activar el acceso automático al entorno gráfico para el usuario kiosko, por lo que tendremos que editar el fichero /etc/lightdm/lightdm.conf y establecer la siguiente configuración:

[SeatDefaults]
autologin-user=kiosko
autologin-user-timeout=0




¿Cómo renombrar documentos obtenidos de digitalizar a una cara documentos a doble cara?

En algunas ocasiones necesitamos digitalizar documentos que están a doble cara pero nuestro escaner no tiene la posibilidad de voltear la página para digitalizar simultáneamente las dos caras, aunque si dispone de alimentador de páginas.

Por lo que podemos digitalizar en una primera etapa las caras impares y en una segunda etapa las caras pares empezando por el final (para no tener que reordenar todas las hojas).

Mediante el siguiente script en Python podemos renombrar todos los ficheros para que estén ordenador y poder procesarlos posteriormente:


import os 
ficheroImpar="caraA" #nombre del fichero de la digitalizacion de las caras impares
inicioFicheroImpar=1 #numero por el que comienza el fichero
finFicheroImpar=157 #numero por el que termina

ficheroParInverso="caraB"
inicioFicheroParInverso=157 #los documentos estan digitalizados empezando por el final
finFicheroParInverso=1

nuevoFichero="vcongreso"
extension=".tiff" #extension de los ficheros
digitos=3 #numero de digitos para completar con ceros

for numeroImpar in range (inicioFicheroImpar, finFicheroImpar+1):
  nombreImpar=ficheroImpar+str(numeroImpar).zfill(digitos)+extension
  nuevoNombreImpar=nuevoFichero+str(numeroImpar*2-1).zfill(digitos+2)+extension
  
  numeroPar=inicioFicheroParInverso-numeroImpar+1
  nombrePar=ficheroParInverso+str(numeroPar).zfill(digitos)+extension
  nuevoNombrePar=nuevoFichero+str(numeroImpar*2).zfill(digitos+2)+extension
  
  print "Renombrar: "+nombreImpar+" "+nuevoNombreImpar
  if os.path.exists(nombreImpar):
    os.rename(nombreImpar,nuevoNombreImpar)
  else:
    print "No existe: "+nombreImpar
    
  print "Renombrar: "+nombrePar+" "+nuevoNombrePar
  if os.path.exists(nombrePar):
    os.rename(nombrePar,nuevoNombrePar)
  else:
    print "No existe: "+nombrePar
 
 
Otra situación habitual es tener todas las páginas digitalizadas pero la numeración no sea consecutiva, por lo que el script anterior no funcionará. Primero renombramos todos los ficheros de forma consecutiva mediante el siguiente programa en python:



import os

fichero="cara B" #nombre del fichero de la digitalización de las caras impares
inicioFichero=1 #numero por el que comienza el fichero
finFichero=190

extension=".tiff" #extension de los ficheros
digitos=3 #numero de digitos para completar con ceros
nuevaSecuencia=1

for numero in range (inicioFichero, finFichero+1):
  nombre=fichero+str(numero).zfill(digitos)+extension
  nuevoNombre=fichero+str(nuevaSecuencia).zfill(digitos)+extension
  if os.path.exists(nombre):
    nuevaSecuencia=nuevaSecuencia+1
    print "Renombrar: "+nombre+" "+nuevoNombre
    os.rename(nombre,nuevoNombre)