32blogby StudioMitsu

Recorte de video sin pérdida con FFmpeg: El método -c copy

Cómo cortar clips de video instantáneamente sin recodificar usando el modo de copia de flujo de FFmpeg. Cubre la restricción de GOP y keyframes, búsqueda de entrada y solución de problemas de sincronización.

7 min read
Contenido

Abrir Premiere Pro o DaVinci Resolve para recortar un clip es excesivo en la mayoría de las situaciones. Si lo único que necesitas es cortar una sección de un video — sin efectos, sin corrección de color, solo un clip — el modo de copia de flujo de FFmpeg completa el trabajo en segundos con cero pérdida de calidad.

bash
ffmpeg -y -ss 00:01:30 -to 00:05:30 -i "input.mp4" -c copy "output.mp4"

Este único comando extrae todo desde 1:30 hasta 5:30, copia los datos codificados tal cual en un nuevo archivo, y termina antes de que un editor GUI hubiera siquiera terminado de cargar.

Los comandos

Windows (PowerShell)

powershell
# Definir variables
$InputVideo = "input.mp4"
$OutputVideo = "output_cut.mp4"
$StartTime = "00:01:30"  # HH:MM:SS
$EndTime = "00:01:40"

# -ss       : Buscar posición de inicio
# -to       : Establecer tiempo final (-t especificaría duración en su lugar)
# -c copy   : Copiar flujos sin recodificar
ffmpeg -y -ss $StartTime -to $EndTime -i "$InputVideo" -c copy "$OutputVideo"

macOS / Linux (Bash)

bash
#!/bin/bash

INPUT="input.mp4"
OUTPUT="output_cut.mp4"
START="00:01:30"
END="00:01:40"

# Colocar -ss antes de -i para búsqueda de entrada (rápido)
ffmpeg -y -ss "$START" -to "$END" -i "$INPUT" -c copy "$OUTPUT"

Cómo funciona la copia de flujo

La opción clave es -c copy (equivalente a -c:v copy -c:a copy). Entender lo que realmente hace explica tanto su poder como sus limitaciones.

Omitir el ciclo de decodificación/codificación

Un flujo de trabajo normal de edición de video se ve así:

  1. Decodificar el video comprimido en fotogramas sin procesar (lento, con pérdida en los bordes)
  2. Procesar los fotogramas (recortar, corregir color, etc.)
  3. Recodificar los fotogramas procesados en video comprimido (lento, introduce pérdida generacional)

La copia de flujo omite los pasos 1 y 3 completamente. FFmpeg lee los paquetes codificados del contenedor fuente (MP4, MKV, etc.) y los escribe directamente en el contenedor de salida sin tocar los datos. La carga computacional es esencialmente solo E/S de disco.

Comparación práctica de velocidad:

Para un video 4K de 10 GB, cortando un clip de 10 segundos:

  • Con recodificación (-c:v libx264): varios minutos
  • Con copia de flujo (-c copy): 1–3 segundos

Búsqueda de entrada: por qué -ss va antes de -i

La posición de -ss en el comando importa significativamente.

  • Antes de -i (búsqueda de entrada): El demuxer salta a la posición especificada en el archivo antes de que comience la decodificación. No se procesan datos antes del punto de búsqueda. Esto es rápido — esencialmente O(1) para la mayoría de los formatos de contenedor.
  • Después de -i (búsqueda de salida): FFmpeg decodifica desde el inicio hasta llegar al tiempo especificado, luego comienza a copiar. Correcto pero lento, y produce resultados inestables con -c copy.

Para recorte sin pérdida, siempre pon -ss antes de -i.

La restricción de keyframe

El recorte sin pérdida tiene una limitación técnica inevitable: el punto de corte se ajusta al keyframe más cercano.

Los códecs modernos (H.264, H.265, AV1) comprimen video usando una estructura llamada GOP (Group of Pictures). Un GOP comienza con un I-frame (keyframe) que contiene datos de imagen completos, seguido de P-frames y B-frames que almacenan solo la diferencia con respecto a los fotogramas circundantes.

Cuando usas -c copy, FFmpeg no puede iniciar la reproducción a mitad de un GOP porque los P/B frames necesitan su I-frame de referencia para decodificarse. Así que si especificas 00:01:30 como tiempo de inicio, FFmpeg retrocede automáticamente al I-frame más cercano antes de ese punto — que podría ser 00:01:27, 00:01:25, o más atrás dependiendo de la estructura del GOP.

El resultado: el punto de corte puede diferir unos segundos (hasta la longitud del GOP) de lo que especificaste.

Implicación práctica: El corte sin pérdida es ideal para recortes "aproximadamente aquí" — grabaciones de conferencias, material de larga duración, clips de podcast. No es adecuado para trabajo editorial con precisión de fotograma. Para cortes precisos, necesitas recodificar.

Solución de problemas

El video de salida comienza con un fotograma negro o congelado

Esto suele ser un problema de compatibilidad del reproductor. Algunos reproductores tienen dificultades cuando el flujo de video comienza con un P-frame en lugar de un I-frame. Añadir -avoid_negative_ts make_zero generalmente lo soluciona:

bash
ffmpeg -ss 00:01:30 -to 00:05:30 -i input.mp4 \
    -c copy \
    -avoid_negative_ts make_zero \
    output.mp4

El audio y el video están desincronizados

La copia de flujo preserva las marcas de tiempo originales, lo que puede causar ligeros problemas de sincronización en los puntos de corte. Solución:

bash
ffmpeg -ss 00:01:30 -to 00:05:30 -i input.mp4 \
    -c copy \
    -avoid_negative_ts make_zero \
    output.mp4

El clip necesita empezar exactamente en el fotograma correcto

Si necesitas precisión a nivel de fotograma, la copia de flujo no funcionará. Usa recodificación con un preset rápido:

bash
# Recodificar video, copiar audio
ffmpeg -ss 00:01:30 -to 00:05:30 -i input.mp4 \
    -c:v libx264 -preset fast -crf 23 \
    -c:a copy \
    output.mp4

Esto es más lento pero comienza exactamente donde especificas.

-t vs -to: ¿cuál es la diferencia?

  • -t 60 — cortar 60 segundos de duración desde el punto de inicio
  • -to 00:05:30 — cortar hasta la marca de tiempo 5:30 en el archivo fuente

Para casos de uso "cortar de X a Y", -to es más intuitivo. Para "cortar X segundos a partir de aquí", usa -t.

Nota: Cuando -ss se coloca antes de -i (búsqueda de entrada), -to se refiere a la marca de tiempo absoluta del archivo de entrada, no a una duración desde el punto de búsqueda. Por ejemplo, -ss 00:01:30 -to 00:05:30 extrae de 1:30 a 5:30 en el archivo original — no 4 minutos a partir de 1:30.

Recorte por lotes

Bash: Procesar una lista de clips desde un archivo CSV

Crea clips.csv:

text
input,start,end,output
video1.mp4,00:01:30,00:05:00,clip1.mp4
video2.mp4,00:00:10,00:02:30,clip2.mp4
video3.mp4,00:10:00,00:15:45,clip3.mp4

Luego procésalo:

bash
#!/bin/bash

tail -n +2 clips.csv | while IFS=',' read -r input start end output; do
    ffmpeg -y -ss "$start" -to "$end" -i "$input" -c copy "$output"
    echo "Hecho: $output"
done

PowerShell: Recorte por lotes con reporte de progreso

powershell
$clips = Import-Csv -Path "clips.csv"
$total = $clips.Count
$i = 0

foreach ($clip in $clips) {
    $i++
    Write-Progress -Activity "Recortando clips" `
        -Status "$($clip.output) ($i/$total)" `
        -PercentComplete (($i / $total) * 100)

    ffmpeg -y -ss $clip.start -to $clip.end `
        -i $clip.input `
        -c copy `
        $clip.output 2>$null

    if ($LASTEXITCODE -eq 0) {
        Write-Host "OK: $($clip.output)"
    } else {
        Write-Host "FALLO: $($clip.output)" -ForegroundColor Red
    }
}

Artículos relacionados

Una vez que hayas recortado tus clips, recodificarlos para obtener tamaños de archivo más pequeños suele ser el siguiente paso:

Conclusión

El recorte sin pérdida de FFmpeg es la herramienta correcta cuando:

SituaciónEnfoque recomendado
Cortes aproximados donde ±5 segundos es aceptable-c copy (el método de este artículo)
Cortes de precisión a nivel de fotogramaRecodificar con -c:v libx264 -preset fast
Recorte por lotes de muchos archivosScript + -c copy
Extraer clips de grabaciones de conferencias-c copy
Preparar clips para redes sociales-c copy (las plataformas recodifican de todos modos)

La copia de flujo trata el video como un flujo de paquetes de datos en lugar de píxeles. Esa abstracción es lo que lo hace tan rápido y sin pérdida — y entenderla abre toda una categoría de operaciones de FFmpeg que operan a nivel de contenedor en lugar de a nivel de códec.