Aquí va el post más geek que he puesto hasta ahora en el blog. Estoy seguro que a ninguno de mis lectores habituales le será útil, pero pronto el ojo que todo lo ve pasará por aquí y lo pondrá disponible al gran público. Además, como me sirve a mí, es más que suficiente.
El objetivo es coger un archivo en mp3 y crear uno nuevo que contenga el trozo que va desde el segundo s1 y hasta el segundo s2. Tenía que ser sencillo, estaba convencido que el lame tendría esa opción incluída, pero parece que no, o al menos no es obvio. Total, que llegué hasta aquí y me encuentro con algo parecido a esto:
mplayer -ao pcm:nowaveheader:file=/dev/fd/10 -really-quiet «archivo_origen.mp3» &1 &>/dev/null |
tail –bytes=+byte_inicio |
head –bytes=bytes_duracion |
lame –quiet -r /dev/stdin «archivo_resultante.mp3»
Dejadme explicarlo un poco. Básicamente lo que hace en global es a fuerza bruta. Decodifica el mp3 a una ristra de bytes que por la salida estándar se corta y se vuelve a codificar cortadito con el lame. ¿Un poco más despacio? Vale.
El mplayer es un fantástico reproductor de archivos multimedia para linux, desde películas a canciones. En la primera línea le decimos al mplayer que, en vez de mandar el mp3 al altavoz, que lo mande a la salida estándar en formato pcm, que es el que acabará entendiendo el lame. El comando tail nos corta el inicio (nos deja la cola, el final, vamos) hasta el byte que le digamos. El head es al revés, nos deja el principio y nos corta la cola. Poniendo correctamente los numeritos, el lame codificará en mp3 únicamente el trozo que le llegue.
¿Cómo calcular el número de bytes?
El bitrate (número de bits por segundo) de un mp3 se obtiene multiplicando la frecuencia (44100, normalmente) por el número de canales (2 si es stereo) por la profundidad (suele ser 16). O sea que el bitrate más común es 1411200 bits por segundo. Como cada byte son 8 bits, nos sale a 176400 bytes por segundo. Conociendo el segundo de inicio y el del final, es fácil calcular los parámetros byte_inicio y bytes_duracion.
Ejemplo
Necesito cortar treinta segundos de elsilenciodeloscorderos.mp3, desde el segundo 50 hasta el 80, y guardarlo en extracto.mp3, porque es la parte que más me gusta. El byte_inicio será el 8820000 (50 * 176400) y 30 segundos son 5292000 bytes. Esto va así:
mplayer -ao pcm:nowaveheader:file=/dev/fd/10 -really-quiet «elsilenciodeloscorderos.mp3» &1 &>/dev/null |
tail –bytes=+8820000 |
head –bytes=5292000 |
lame –quiet -r /dev/stdin «extracto.mp3»
Estoy seguro que hay formas más fáciles, pero así he aprendido un montón.