iconoMas tutorial de ffmpeg

ffmpeg para las principales tareas de video y audio, como sacarle jugo al programa.

Esto es una continuación del breve tutorial de ffmpeg que publiqué anteriormente.

Nota: Normalmente estoy usando para los ejemplos videos .dv que son los que tienes al capturar de una video camara, pero casi todos los ejemplos se pueden hacer con cualquier tipo de archivo de video como .avi, .flv, mpg, etc.

1) Para pasar a camara lenta (hace falta mjpegtools):
-------------------------------------------------------------------------

ffmpeg -i original.dv -f yuv4mpegpipe - | yuvfps -s 15:1 -r 15:1 | ffmpeg -f yuv4mpegpipe -i - -r 25 -y lento.dv

Explicación:
-i video de entrada
-f formato, en este caso yuv4mpegpipe

Luego los parámetros yuvfps: -s y -r son los frames por segundo, es decir 15:1 15 frames por segundo, para mas lento 10:1 o 7:1
-r son los frames por segundo
-y para que sobre escriba el archivo de salida
lento.dv es el nuevo video a camara lenta.

2) Para recortar partes de un video cambiando el tamaño:
-----------------------------------------------------------------------------

ffmpeg -i entrada.dv -croptop 150 -cropbottom 150 -sameq recortado.mpg

Explicación:
-i video de entrada
-croptop recorta de arriba 150px en este caso
-cropbottom recorta de abajo 150px en este caso
-sameq es para mantener la misma calidad que el original (same quality)

También existe-cropleft, recorta a la izquierda, y -cropright, recorta a la derecha.
He probado con salida recortado.avi en vez de recortado.mpg, pero el avi me sale deformado.

3) Para recortar partes de un video SIN cambiarlo de tamaño:
--------------------------------------------------------------------------------------

ffmpeg -i entrada.dv -padtop 150 -padbottom 150 -sameq recortado-mismo-tamaño.mpg

Explicación:
-i video de entrada
-padtop borra de arriba 150px en este caso
-padbottom borra de abajo 150px en este caso
-sameq es para mantener la misma calidad que el original (same quality)

También existe -padleft, borra a la izquierda, y -padright, borra a la derecha.
El video no cambia de tamaño como en el ejemplo anterior y pone bandas negras.

Puedes indicar el color que quieras para las bandas con '-padcolor color_hexadecimal', si añades '-padcolor ff0000' las bandas serían rojas.

4) Para añadir otra pista de audio al video (por ejemplo para tener un video con audio en español e inglés):
---------------------------------------------------------------------------------------------------------------------------

ffmpeg -i video-ingles.dv -i audio-español.mp3 -sameq -acodec libmp3lame -acodec libmp3lame peli-con-dos-audios.mpg -newaudio

Explicación:
-i el primero es el video de entrada, el segundo es el audio que quieres añadir
-sameq para que mantenga la misma calidad que el original
-acodec el codec de audio, se indica dos veces, una para cada pista
peli-con-dos-audios.mpg es el archivo de salida
-newaudio añade una nueva pista de audio al archivo de salida

5) Para sacar trozos de un video o audio:
----------------------------------------------------------

ffmpeg -i entrada.dv -t 180 -ss 60 -sameq tres-minutos.dv

Explicación:
-i video de entrada
-t es el tiempo en segundos que quieres procesar en este caso 3 minutos
-ss es desde donde quieres procesar en segundos en este caso 1 minuto
-sameq para que mantenga la misma calidad

6) Para unir varios videos o audios en uno:
--------------------------------------------------------

Primero hay que pasarlos a mpg con:

ffmpeg -i video1.avi -sameq video1.mpg
ffmpeg -i video2.avi -sameq video2.mpg
ffmpeg -i video3.avi -sameq video3.mpg

Los unes con
cat video1.mpg video2.mpg video3.mpg > todos-juntos.mpg

Para archivos .dv o .VOB NO hay que pasarlos a mpg

Ahora si quieres puedes convertir el archivo final al formato que quieras.

Para audio en mp3 puedes hacer directamente:
cat audio1.mp3 audio2.mp3 audio3.mp3 > todos-juntos.mp3

7) Para pasar de wav a mp3:
---------------------------------------------
ffmpeg -i audio.wav -ar 22050 -ab 128k un-mp3.mp3

Explicación:
-i el audio que quieres convertir
-ar la frecuencia en este caso 22050 Hz
-ab el bitrate

8) Resolución de problemas (algunos)
----------------------------------------------------
Muchas veces lo que encuentras en internet y funciona para algunos no te funciona a ti. Cada cual tiene su versión de ffmpeg y cada versión viene con unas u otras opciones.
Siguiendo los ejemplos que he puesto te pueden salir el siguiente error al intentar hacer un mp3:

Unsupported codec for output stream ....

Esto es porque con las distribuciones oficiales de Ubuntu no viene ninguna libreria que tenga algo de código propietario. Por ejemplo Ubuntu Karmic Koala 9.10 no viene con codificadores para mp3, xvid, h264 y bastantes mas y no hay manera de hacer nada con ellos. La solución está en instalar la librería libavcodec-extra-52 del repositorio de Medibuntu.

Para poder instalar desde Medibuntu primero tienes que añadir los repositorios de ellos escribiendo en consola:

sudo wget http://www.medibuntu.org/sources.list.d/`lsb_release -cs`.list --output-document=/etc/apt/sources.list.d/medibuntu.list && sudo apt-get -q update && sudo apt-get --yes -q --allow-unauthenticated install medibuntu-keyring && sudo apt-get -q update

Te pedirá tu password.

Este chorizo de comando está adaptado de Medibuntu - Community Ubuntu Documentation visto en ubuntuforums

Luego puedes instalarte libavcodec-extra-52 desde el synaptic.

Otro tipo de errores que te puedes encontrar aún teniendo el codec para mp3 (libmp3lame) puede ser:

Error while opening codec for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height

Lo que te dice es que los parametros no valen, prueba cambiando el -ar a la mitad del original (de 48000Hz a 24000Hz) por ejem '-ar 24000', si no va también intenta meter solo 2 canales de audio con '-ac 2'. Si estás con un video prueba cambiando los fps o rate con 'r 25' para pal o tal vez sea por el tamaño prueba a cambiarlo con '-s ANCHOxALTO'

9) Para ver que codecs y formatos maneja la versión que tienes de ffmpeg:
------------------------------------------------------------------------------------------

ffmpeg -formats
Si escribes ffmpeg -format > formatos-ffmpeg.txt te creará un achivo que seguramente será mas amigable de consultar.

Te dice cosas como:

DEA ac3 ATSC A/52A (AC-3)
DEV D dvvideo DV (Digital Video)
D V D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
DEVSD huffyuv Huffyuv / HuffYUV
EA libmp3lame libmp3lame MP3 (MPEG audio layer 3)
EV libtheora libtheora Theora
EA libvorbis libvorbis Vorbis
EV libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
DEVSDT mpeg2video MPEG-2 video
DEVSDT mpeg4 MPEG-4 part 2

Parece complicado por la cantidad de información,pero significa:
Primera columna:
D = decodifica
E = codifica
A = audio
V = video
S = subtítulos
D = render directo
T = maneja la entrada de lugares aleatorios

La segunda columna (ac3 o libmp3lame o mpeg4 etc) es elnombre del codec como debe pasarse para que lo reconozca.
Aquí vemos que h264 decodifica, pero para codificar tienes que poner libx264.

Y para terminar
10) Como hacerse un avi de varios VOB de un dvd (casero eso si, que sino está prohibido)
----------------------------------------------------------------------------------------------------

Primero juntamos todos los VOB en un solo video:

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB > todo-junto.mpg

Esto nos crea un archivo de varios gigas, pero no nos asustemnos, lo borraremos nada mas terminar con el ffmpeg.

Ahora le pasamos a ffmpeg el archivo todo-junto.mpg

ffmpeg -i todo-junto.mpg -map 0:0 -vcodec libx264 -vpre hq -crf 22 -threads 0 -s 560x420 -map 0:1 -acodec libmp3lame -ar 24000 -ab 128k -f avi la-peli.avi

Explicación:
-i video de entrada
-map 0:0 indica el canal que quieres en este caso es el del video
-vcodec el videio codec que utilizamos
-vpre indica la preconfiguración que queremos que es hq (hight quality o alta calidad)
-crf el factor constante del rate (o cantidad de bits por segundo) a menor número mejor la calidad y mayor los bits/segundo
-threads el número de procesos 0 o auto
-s el tamaño en píxeles en este caso partiendo de 720x576 de PAL lo he reducido un poco manteniendo la proporción 4:3
-map 0:1 indica el canal que quieres en este caso es el primero de audio, si hay mas de un audio puedes poner '-map 0:2' si quieres la segunda pista de audio
-acodec el codec de audio
-ar la frecuencia de audio en Hz
-ab el bitrate del audio
-f para forzar el formato

Archivos

free blog