jueves, 12 de noviembre de 2015

Cortar un audio (con ffmpeg)

En mis tiempos de windowsero, cuando quería cortar un audio, usaba un programita clásico, el MP3DirectCut, que era muy sencillo aunque, como lo usaba muy de tarde en tarde, siempre tenía que consultar mis apuntes para ver cómo se hacía. En Linux no existe esta aplicación (o al menos nunca la encontré), pero si que tengo instalada otra, bastante similar, que se llama 'Mp3splt-gtk audio-splitter' (paquete mp3splt-gtk), aunque debo decir que es bastante más complicado acordarse (eventualmente) de cómo se usa.
Total, que era mi asignatura pendiente, hasta que hoy, que tenía que retocar un MP3, me puse a investigar un poco… y me encontré, una vez más, con Santa Consola y Santo Comando ffmpeg.
Y resulta que es facilísimo. Vamos a verlo:
Bueno, lo primero, es importante aclarar que donde digo 'cortar' debe entenderse por 'extraer' porque lo que cortas es, precisamente, la parte del archivo de audio que se te va a guardar. Así que…
Cortar (extraer) 'X' segundos desde el principio de un audio
Se hace con el comando
ffmpeg -i Audio.mp3 -t [duración_del_corte] AudioCortado.mp3
Por ejemplo, si quieres quedarte solo con el primer minuto y medio (o sea, 90 segundos) de la canción 'miaudio.mp3' basta abrir una consola en la carpeta donde se encuentre ese archivo y dar esta orden:
ffmpeg -i miaudio.mp3 -t 90 miaudio_cortado.mp3
(recuerda, hay que poner en segundos la duración de lo que quieres extraer)

Cortar (extraer) una parte intermedia de un audio
Solo tienes que definir desde qué instante empieza esa parte, y ponerlo en segundos, y (en principio) definir cuantos segundos va a durar ese corte.
Y usar este comando:
ffmpeg -i Audio.mp3 -ss [segundo _de_inicio] -t [duración_del_corte] AudioCortado.mp3
En el ejemplo anterior, si quieres cortar (extraer) desde el minuto y 10 segundos hasta el minuto y 53 segundos pondrías esto:
ffmpeg -i miaudio.mp3 -ss 70 -t 43 miaudio_cortado.mp3 
(para aclarar el concepto, por supuesto que '-i' es par indicar el 'input', '-ss' para indicar el instante inicial en el que debe acxtual ffmpeg, y '-t' para indicar el final de la acción)
Cortar (extraer) la parte final de un audio 
Si quieres extraer la parte final de un audio, desde el instante 'X', por ejemplo desde el instante 2:30, no hace falta que calcules la duración del corte, ni nada: por defecto si no pones el parámetro -t ffmpeg entiende que es 'hasta el final del audio ('desde el instante -ss XX'), así que basta poner algo como esto:
ffmpeg -i miaudio.mp3 -ss 150 miaudio_cortado.mp3 
Y solucionado. Recuerda, al parecer, hay que poner todos los tiempos (comienzo, final, duración, …) en segundos. (Digo 'al parecer' por lo que añado a continuación...)
NOTA: he probado con otros formatos (OGG, WAV...), y también funciona perfectamente.

Así que es así de sencillo. Ahora mismo voy a jubilar (desinstalar) el paquete 'mp3splt-gtk', que no pienso utilizar nunca más.

Pero, puestos a ello, aún hay algo más...

Como cortar un video con ffmpeg
Pues leí que se hace con una orden similar, algo como esto:
ffmpeg -sameq -ss [instante_inicio] -t [duracion_segundos] -i [input.avi] [ouput.avi] 
Por supuesto, la opción 'sameq' es para obtener un video de similar calidad. Y también decir que el parámetro -t [duracion_segundos] es opcional; si no se especifica ffmpeg toma por defecto la duración total del video.
y NOTA... los instantes de inicio (y final) hay que ponerlos en formato hh:mm:ss.
También se puede especificar el corte final en el formato hh:mm:ss, en vez de la duración, usando el mismo parámetro -t
También se puede probar con 
ffmpeg -i mivideo.mp4 -ss [instante_inicio] -t [instante_final] -async 1 videoCortado.mp4
Por tanto, con ffmpeg parece, también, muy sencillo… aunque para manejar videos también es muy sencillo, como decía aquí, usar el Avidemux.

5 comentarios:

  1. Como hago para mantener el bitraje? porque de 320Kbps me lo baja a 124?

    ResponderEliminar
  2. quizás sea porque, si no se dice nada, ffmpeg pone, por defecto, 128 kbps (es curioso, en otro sitio leo que pone 64). Pero esto se puede arreglan, y se me ocurren dos formas:
    a) indicando que mantenga la misma calidad (el mismo bitrate) de audio: Esto se hace añadiendo el mandato '-q:a 0' (sin las comillas), por ejemplo justo antes del nombre del archivo de salida
    b) Forzando un bitrate de audio. Si, por ejemplo, queremos forzar que el archivo de salida tenga como bitrate de audio 192 kbps añadiríamos (como antes) el mandato '-ab 192k' (o -ab 192000)

    ResponderEliminar
  3. Y usar este comando:
    ffmpeg -i Audio.mp3 -ss [segundo _de_inicio] -t [duración_del_corte] AudioCortado.mp3
    En el ejemplo anterior, si quieres cortar (extraer) desde el minuto y 10 segundos hasta el minuto y 53 segundos pondrías esto:
    ffmpeg -i miaudio.mp3 -ss 70 -t 113 miaudio_cortado.mp3

    ****** No sería 113 , sería 43 por lo menos a mi . Gracias . Un saludo.

    ResponderEliminar
  4. tienes toda la razón. Ya lo he corregido. Gracias

    ResponderEliminar
  5. Maravilla, excelente.
    ffmpeg -i audio_IN.m4a -acodec aac -ab 140k -ss 10 -t 405 audio_OUT.m4a

    ResponderEliminar