6  Multimedia

El procesamiento de archivos multimedia desde la línea de comandos es extremadamente potente y versátil. Esta sección cubre herramientas para manipular video, audio e imágenes con precisión profesional.

6.1 ffmpeg - Suite multimedia completa

FFmpeg es la herramienta más potente para procesamiento multimedia, capaz de manejar prácticamente cualquier formato de video y audio.

6.1.1 Conversión básica

# Convertir formato de video
ffmpeg -i input.mov output.mp4
ffmpeg -i input.avi output.mkv

# Conversión con codec específico
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

# Conversión rápida (solo cambiar contenedor)
ffmpeg -i input.mkv -c copy output.mp4

6.1.2 Manipulación de video

6.1.2.1 Redimensionamiento y calidad

# Cambiar resolución
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
ffmpeg -i input.mp4 -vf scale=1920:-1 output.mp4  # Mantener aspecto

# Comprimir video
ffmpeg -i input.mp4 -crf 23 output.mp4  # CRF 18-28 (menor = mejor calidad)

# Cambiar bitrate
ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4

6.1.2.2 Edición temporal

# Cortar video (desde segundo 30, duración 60s)
ffmpeg -i input.mp4 -ss 30 -t 60 output.mp4

# Cortar desde inicio hasta minuto 2
ffmpeg -i input.mp4 -t 120 output.mp4

# Cortar desde minuto 1 hasta el final
ffmpeg -i input.mp4 -ss 60 output.mp4

6.1.2.3 Efectos y filtros

# Rotar video
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4  # 90° horario

# Espejo horizontal
ffmpeg -i input.mp4 -vf hflip output.mp4

# Acelerar/desacelerar
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4  # 2x velocidad
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output.mp4   # 0.5x velocidad

# Agregar watermark
ffmpeg -i video.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

6.1.3 Audio processing

# Extraer audio de video
ffmpeg -i video.mp4 -vn -acodec copy audio.aac
ffmpeg -i video.mp4 -vn audio.mp3

# Cambiar volumen
ffmpeg -i input.mp3 -af "volume=0.5" output.mp3  # 50% volumen
ffmpeg -i input.mp3 -af "volume=10dB" output.mp3  # +10dB

# Normalizar audio
ffmpeg -i input.mp3 -af loudnorm output.mp3

# Combinar audio y video
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4

6.1.4 Casos avanzados

6.1.4.1 Crear GIF desde video

# GIF básico
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" output.gif

# GIF optimizado con paleta
ffmpeg -i input.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=15,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif

6.1.4.2 Streaming y transmisión

# Stream a YouTube Live
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -maxrate 3000k -bufsize 6000k \
-pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 \
-f flv rtmp://a.rtmp.youtube.com/live2/STREAM_KEY

# Crear HLS stream
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 \
-hls_time 10 -hls_list_size 0 -f hls output.m3u8

6.2 yt-dlp - Descargador universal

Sucesor mejorado de youtube-dl, capaz de descargar de cientos de sitios.

6.2.1 Descarga básica

# Descargar video en mejor calidad
yt-dlp "https://youtube.com/watch?v=VIDEO_ID"

# Solo audio en MP3
yt-dlp -x --audio-format mp3 "URL"

# Calidad específica
yt-dlp -f "best[height<=720]" "URL"
yt-dlp -f "worst" "URL"  # Menor calidad

6.2.2 Opciones avanzadas

6.2.2.1 Listas y canales

# Playlist completa
yt-dlp "https://youtube.com/playlist?list=PLAYLIST_ID"

# Solo videos nuevos de playlist
yt-dlp --download-archive downloaded.txt "PLAYLIST_URL"

# Canal completo
yt-dlp "https://youtube.com/c/CHANNEL_NAME/videos"

# Últimos N videos de canal
yt-dlp --playlist-end 10 "CHANNEL_URL"

6.2.2.2 Filtros y selección

# Ver formatos disponibles
yt-dlp -F "URL"

# Seleccionar formato específico
yt-dlp -f 137+140 "URL"  # Video 1080p + audio

# Filtros complejos
yt-dlp -f "best[ext=mp4][height<=1080]" "URL"
yt-dlp -f "bestvideo[height<=720]+bestaudio/best[height<=720]" "URL"

6.2.2.3 Metadata y organización

# Con subtítulos
yt-dlp --write-subs --sub-lang es,en "URL"
yt-dlp --write-auto-subs --sub-lang es "URL"

# Con thumbnail
yt-dlp --write-thumbnail "URL"

# Template de nombres de archivo
yt-dlp -o "%(uploader)s/%(title)s.%(ext)s" "URL"
yt-dlp -o "%(upload_date)s-%(title)s.%(ext)s" "URL"

6.2.3 Scripts automatizados

6.2.3.1 Descargador de podcast

#!/bin/bash
# podcast-downloader.sh

PODCAST_URL="$1"
DOWNLOAD_DIR="$HOME/Podcasts"

if [ -z "$PODCAST_URL" ]; then
    echo "Uso: $0 <URL_del_podcast>"
    exit 1
fi

mkdir -p "$DOWNLOAD_DIR"
cd "$DOWNLOAD_DIR"

# Descargar solo audio, organizados por canal
yt-dlp \
    --extract-flat \
    --download-archive podcast-archive.txt \
    -x --audio-format mp3 \
    --audio-quality 192K \
    -o "%(uploader)s/%(upload_date)s - %(title)s.%(ext)s" \
    "$PODCAST_URL"

echo "Podcasts descargados en $DOWNLOAD_DIR"

6.3 ImageMagick - Manipulación de imágenes

Suite completa para edición de imágenes desde línea de comandos.

6.3.1 Conversión y redimensionamiento

# Convertir formato
convert image.png image.jpg
convert image.tiff image.webp

# Redimensionar imagen
convert image.jpg -resize 50% small.jpg
convert image.jpg -resize 800x600 resized.jpg
convert image.jpg -resize 800x600! forced.jpg  # Forzar dimensiones exactas

6.3.2 Edición básica

6.3.2.1 Rotación y volteo

# Rotar imagen
convert image.jpg -rotate 90 rotated.jpg
convert image.jpg -rotate -45 rotated.jpg

# Espejo
convert image.jpg -flop horizontal.jpg  # Horizontal
convert image.jpg -flip vertical.jpg    # Vertical

6.3.2.2 Efectos y filtros

# Blur
convert image.jpg -blur 0x8 blurred.jpg

# Sharpen
convert image.jpg -sharpen 0x1 sharp.jpg

# Sepia
convert image.jpg -sepia-tone 80% sepia.jpg

# Blanco y negro
convert image.jpg -colorspace gray bw.jpg

6.3.3 Procesamiento por lotes

6.3.3.1 mogrify para múltiples archivos

# Redimensionar todas las imágenes JPG
mogrify -resize 50% *.jpg

# Convertir PNG a JPG
mogrify -format jpg *.png

# Agregar borde a todas las imágenes
mogrify -border 10x10 -bordercolor black *.jpg

6.3.3.2 Scripts de procesamiento masivo

#!/bin/bash
# optimize-images.sh - Optimizar imágenes para web

input_dir="$1"
output_dir="$2"

if [ ! -d "$input_dir" ]; then
    echo "Directorio de entrada no existe: $input_dir"
    exit 1
fi

mkdir -p "$output_dir"

# Procesar cada imagen
find "$input_dir" -type f \( -iname "*.jpg" -o -iname "*.png" \) | while read -r img; do
    filename=$(basename "$img")
    name="${filename%.*}"
    
    echo "Procesando: $filename"
    
    # Crear versiones optimizadas
    convert "$img" -resize 1920x1920\> -quality 85 "$output_dir/${name}_large.jpg"
    convert "$img" -resize 800x800\> -quality 80 "$output_dir/${name}_medium.jpg"
    convert "$img" -resize 400x400\> -quality 75 "$output_dir/${name}_small.jpg"
    convert "$img" -resize 150x150^ -gravity center -extent 150x150 -quality 70 "$output_dir/${name}_thumb.jpg"
done

echo "Optimización completada. Archivos en: $output_dir"

6.3.4 Casos avanzados

6.3.4.1 Crear montajes y collages

# Montage simple
montage *.jpg -tile 3x3 -geometry +2+2 collage.jpg

# Montage con labels
montage *.jpg -tile 2x2 -geometry 300x300+10+10 -pointsize 20 -label '%t' labeled_montage.jpg

6.3.4.2 Procesamiento de imágenes con texto

# Agregar texto
convert image.jpg -pointsize 30 -fill white -gravity south \
-annotate +0+10 "Mi texto" output.jpg

# Crear imagen con solo texto
convert -size 800x600 xc:white -pointsize 72 -fill black \
-gravity center -annotate +0+0 "Hello World" text_image.jpg

6.4 Workflows multimedia complejos

6.4.1 Pipeline completo de video

#!/bin/bash
# video-pipeline.sh - Procesamiento completo de video

input_video="$1"
output_dir="./processed"

if [ ! -f "$input_video" ]; then
    echo "Archivo no encontrado: $input_video"
    exit 1
fi

mkdir -p "$output_dir"
filename=$(basename "$input_video" .mp4)

echo "🎬 Procesando: $input_video"

# 1. Extraer frames para análisis
ffmpeg -i "$input_video" -vf fps=1 "$output_dir/frames/frame_%04d.png"

# 2. Crear thumbnail
ffmpeg -i "$input_video" -ss 00:00:05 -vframes 1 -vf scale=320:180 "$output_dir/${filename}_thumb.jpg"

# 3. Versiones en diferentes calidades
ffmpeg -i "$input_video" -c:v libx264 -crf 23 -vf scale=1920:1080 "$output_dir/${filename}_1080p.mp4"
ffmpeg -i "$input_video" -c:v libx264 -crf 28 -vf scale=1280:720 "$output_dir/${filename}_720p.mp4"
ffmpeg -i "$input_video" -c:v libx264 -crf 32 -vf scale=854:480 "$output_dir/${filename}_480p.mp4"

# 4. Extraer audio
ffmpeg -i "$input_video" -vn -acodec libmp3lame -ab 192k "$output_dir/${filename}_audio.mp3"

# 5. Crear GIF preview
ffmpeg -i "$input_video" -ss 00:00:10 -t 5 -vf "fps=10,scale=480:-1:flags=lanczos" "$output_dir/${filename}_preview.gif"

echo "✅ Procesamiento completado en: $output_dir"

6.4.2 Optimización automática de medios

#!/bin/bash
# media-optimizer.sh - Optimizar medios para web

process_images() {
    local dir="$1"
    echo "📸 Optimizando imágenes en: $dir"
    
    find "$dir" -type f \( -iname "*.jpg" -o -iname "*.png" \) | while read -r img; do
        # Optimizar sin perder calidad visible
        if [[ "$img" == *.jpg ]]; then
            convert "$img" -strip -interlace Plane -gaussian-blur 0.05 -quality 85% "$img.optimized"
            mv "$img.optimized" "$img"
        elif [[ "$img" == *.png ]]; then
            convert "$img" -strip "$img.optimized"
            mv "$img.optimized" "$img"
        fi
    done
}

process_videos() {
    local dir="$1"
    echo "🎬 Optimizando videos en: $dir"
    
    find "$dir" -type f \( -iname "*.mp4" -o -iname "*.mov" \) | while read -r video; do
        filename="${video%.*}"
        ext="${video##*.}"
        
        # Crear versión optimizada
        ffmpeg -i "$video" -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 128k "${filename}_optimized.mp4"
        
        # Comparar tamaños
        original_size=$(stat -f%z "$video")
        optimized_size=$(stat -f%z "${filename}_optimized.mp4")
        
        if [ "$optimized_size" -lt "$original_size" ]; then
            mv "${filename}_optimized.mp4" "$video"
            echo "✅ $video optimizado ($(echo "$original_size - $optimized_size" | bc) bytes ahorrados)"
        else
            rm "${filename}_optimized.mp4"
            echo "ℹ️ $video ya está optimizado"
        fi
    done
}

# Procesar directorio especificado
target_dir="${1:-.}"
process_images "$target_dir"
process_videos "$target_dir"

echo "🎉 Optimización completada!"
Tips para multimedia
  • Usa ffprobe para analizar archivos multimedia antes de procesar
  • FFmpeg puede procesar múltiples archivos en paralelo con GNU parallel
  • ImageMagick’s identify te da información detallada de imágenes
  • Mantén siempre respaldos antes de procesamiento destructivo
Consideraciones de rendimiento
  • FFmpeg es intensivo en CPU, especialmente con video HD/4K
  • ImageMagick puede usar mucha RAM con imágenes grandes
  • yt-dlp respeta rate limits, pero algunos sitios pueden bloquear por uso excesivo

En el próximo capítulo exploraremos herramientas de red y descargas para transferencia de datos e interacción con APIs.