====== ffmpeg ======
===== FFplay =====
Con la instalación de FFmpeg se incluye FFplay, un sencillo reproductor multimedia que suele usarse para probar filtros de FFmpeg.
ffplay -vf "drawtext=text='Vacaciones 2023':y=h-text_h-10:x=(w/2-text_w/2):fontsize=20" video.mkv
Durante la reproducción:
^ Acción ^ Tecla ^
| Alterna pantalla completa | f |
| Pausa/reanuda la reproducción | space |
| Alternar silenciar | m |
| Salir | q, Esc |ffprobe gathers information from multimedia streams and prints it in human- and machine-readable fashion.
| Avanzar fotograma a fotograma | s |
===== ffprobe =====
La instalación de FFmpeg también incluye la herramienta ''ffprobe'' que permite obtener información de archivos multimedia.
ffprobe video.mp4
Ejemplo de salida:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bbb_sunflower_1080p_60fps_normal.mp4':
Metadata:
[...]
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
[...]
Stream #0:0[0x1](und): Video: h264 [...]
[...]
Stream #0:1[0x2](und): Audio: mp3 [...]
[...]
Stream #0:2[0x3](und): Audio: ac3 [...]
Si queremos obtener la información en formato JSON:
ffprobe -v error -hide_banner -print_format json -show_streams video.mp4
* ''-v error'': solo mostrar información extra si hay error.
* ''-hide_banner'': ocultar información sobre la compilación de FFmpeg
* ''-print_format'': formato en el que presentar la información.
* ''-show_streams'': solo mostrar información de los streams.
===== Soporte de códecs y formatos =====
Para saber qué códecs soporta la compilación de ffmpegque tengamos en nuestro sistema:
ffmpeg -codecs
Ejemplos de códecs:
* H.264 (AVC, MPEG-4)
* H.265 (HEVC)
* AAC
* MP3
* OGG
Para saber los formatos de ficheros:
ffmpeg -formats
Ejemplos de formatos:
* AVI
* Matroska (MKV)
* Ogg
==== Convertir vídeos a MP4 ====
ffmpeg -i example.mov -f mp4 -vcodec libx264 -preset fast -profile:v main -acodec aac example.mp4 -hide_banner
* ''-f mp4'': indicamos que el archivo de salida tendrá el formato mp4
* ''-vcodec libx264'': códec de vídeo a usar (libx264 es el codificador de vídeo H264)
* ''-preset fast'': perfil a usar con el códec libx264. Están disponibles ''ultrafast'', ''superfast'', ''veryfast'', ''faster'', ''fast'', ''medium'', ''slow'', ''slower'' o ''veryslow''. Las preconfiguraciones lentas producen una mejor calidad de vídeo en menos espacio, pero llevará más tiempo el procesado.
* ''-profile:v main'': indicamos al codificador cierto perfil para usar opciones avanzadas para mejorar la compresión. Están disponibles ''baseline'', ''main'', ''high'', ''high10'', ''high422'' y ''high444''
* ''-acodec aac'': códec de audio a emplear. En este caso ''aac codec''.
* ''-hide_banner'': si queremos ocultar la información sobre el proceso de ffmpeg.
==== Grabar streaming ====
ffmpeg -i rtsp://usuario:contraseña@servidor.com:443/stream -vcodec copy prueba.mp4
Ejemplo para cámara Foscam:
ffmpeg -t 00:10:00 -i "rtsp://user:pass@192.168.0.3:443/videoMain" -vcodec copy -acodec copy foscam.mkv
==== Duración de la grabación ====
ffmpeg -t 00:10:00 -i rtsp://usuario:contraseña@servidor.com:443/stream -vcodec copy "prueba-$(date +%F).mp4"
* ''-t'' indica la duración. Se puede indicar en segundos o en formato ''hh:mm:ss''.
==== Grabación de segmentos ====
Para hacer cortes en una grabación continua:
ffmpeg -i rtsp://ip.cam/unicast -vcodec copy -map 0 -f segment -segment_time 30 -segment_format mp4 "video-%03d.mp4"
* ''vcodec''
* ''map''
* ''f''
* ''segment_time'': duración de los segmentos en segundos.
El anterior comando creará ficheros de 30 segundos con el formato ''video-xxx.mp4'', donde ''xxx'' va desde 000 hasta 999.
===== Edición =====
==== Cortar fragmento ====
Si queremos cortar un trozo de cierto vídeo sin realizar una recodificación:
ffmpeg -i video.mp4 -ss 02:00 -to 10:00 -c copy resultado.mp4
* ''ss'': indica desde dónde se hace el corte (''mm:ss'')
* ''to'': indica hasta dónde se hace el corte (''mm:ss'')
===== Casos de uso =====
* Procesamiento de vídeo:
* Rotar
* Extracción de frames
* Extracción de segmentos
* Extracción de audio
* Extracción de subtítulos
* Conversión de colores
* Reducción de tamaño
* Conversión de formatos
* Convertir GIF en vídeo
* Procesamiento de audio:
* Compresión de vídeo
* Normalización
* Ganancia
* Remuxing
* Empaquetado de vídeo
* HLS
* MPEG-DASH
* RTMP
===== Webcam =====
Para ver el fichero asociado con la webcam:
v4l2-ctl --list-devices
Para ver los formatos soportados por la webcam:
v4l2-ctl --list-formats-ext --device /dev/video0
==== Grabar un fragmento ====
El siguiente comando activará la webcam y grabará durante 10 segundos. El resultado se almacenará en el fichero ''10seconds_of_webcam.webm''.
ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -t 10 -i /dev/video0 10seconds_of_webcam.webm
==== Streaming ====
Para hacer streaming del vídeo de la webcam y el audio del micro, suponiendo que además tenemos un servidor RTMP (el que se encargará de hacer la transmisión):
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1,0 -c:v libx264 -pix_fmt yuv420p -framerate 15 -g 30 -b:v 500k -c:a aac -b:a 128k -ar 44100 -ac 2 -preset ultrafast -tune zerolatency -f flv rtmp://localhost:1935/live/foo
* ''-c:v libx264'': usaremos el códec de vídeo H.264
* ''-c:a aac'': usaremos el código de audio AAC
* ''-f alsa -i hw:1,0'': micrófono (comprobar con ''arecord -l'').
* ''-ar'': frecuencia de muestreo del audio (en Hz)
* ''-ac'': número de canales de audio
* ''-b:v'': bitrate de vídeo
* ''-preset'': opciones para la compresión. Indicamos ''ultrafast'' que apenas realizará compresión.
* ''-tune'': ajustamos para que se reduzca la latencia (retraso).
* [[https://www.baeldung.com/linux/ffmpeg-webcam-stream-video|How to Stream Video From Webcam to Network Using FFmpeg]]
Los protocolos más habituales para streaming son:
* RTMP
* HLS
* DASH
* UDP
* RTP
* RTSP
====== Recursos ======
* http://www.bugcodemaster.com/article/convert-videos-mp4-format-using-ffmpeg
* http://www.bugcodemaster.com/article/how-extract-and-join-video-files-using-ffmpeg
* http://www.bugcodemaster.com/article/changing-resolution-video-using-ffmpeg
* http://www.bugcodemaster.com/article/crop-video-using-ffmpeg
* http://www.bugcodemaster.com/article/convert-video-animated-gif-using-ffmpeg
* http://www.bugcodemaster.com/article/extract-images-frame-frame-video-file-using-ffmpeg
* http://www.bugcodemaster.com/article/get-information-video-file-using-ffmpeg
* [[https://gist.github.com/steven2358/ba153c642fe2bb1e47485962df07c730|FFmpeg cheatsheet]]