2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357

Usando ffmpeg para cortar el video

Estoy usando ffmpeg para cortar una sección de un archivo grande como este:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

La parte de -ss funciona bien pero el -t es ignorado. Elimina correctamente los segundos iniciales especificados con -ss pero luego sigue yendo al final de la entrada con la copia.

¿Hay alguna manera de usar ffmpeg para cortar el final de un vídeo sin recodificarlo?

Respuestas (7)

105
105
105
2014-01-20 04:07:24 +0000

Como otras personas mencionaron, poner el -ss antes (mucho más rápido) o después (más exacto) del -i hace una gran diferencia. La sección “Búsqueda rápida y precisa” en la página de búsqueda de ffmpeg te dice cómo conseguir ambas cosas, y yo la he usado, y hace una gran diferencia. Básicamente pones el -ss antes y después del -i, sólo asegúrate de dejar suficiente tiempo antes de donde quieres empezar a cortar para tener otro marco clave. Ejemplo: Si quieres hacer un clip de 1 minuto, de 9min0seg a 10min 0seg en Video.mp4, podrías hacerlo tanto rápidamente como con precisión usando:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

El primer -ss busca rápido hasta (aproximadamente) 8min0seg, y luego el segundo -ss busca con precisión hasta 9min0seg, y el -t 00:01:00 saca un clip de 1min0seg.

Observa también este punto importante de esa página: “Si usas -ss con -c:v copy, el flujo de bits resultante podría terminar entrecortado, no reproducible o fuera de sincronización con el flujo de audio, ya que ffmpeg está obligado a usar/separar sólo en los i-frames”.

Esto significa que necesitas recodificar el video, incluso si quieres sólo copiarlo, o arriesgarte a que esté entrecortado y fuera de sincronización. Podrías intentar primero con -c copy, pero si el video apesta tendrás que volver a hacerlo.

27
27
27
2014-05-09 02:24:58 +0000

Encontré que -ss combinado con -c copy resultó en un corte de medio segundo al principio.

Para evitar eso, tienes que remover el -c copy (que admito que hará un transcódigo).

13
13
13
2014-09-04 05:48:57 +0000

MANUALMENTE

Abrir el archivo en un reproductor de medios que avanzará cuadro por cuadro y reproducirá un archivo AVISynth con datos como:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Luego cortar con el formato de tiempo EXACTO:

ffmpeg -i "Path\do you want him.flv" \
       -ss 00:00:05.240 -to 00:00:08.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

y

ffmpeg -i "Path\do you want him.flv" \
       -ss 00:00:10.240 -to 00:00:14.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Ahora haz un archivo txt con los archivos de video con contenidos como:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Ejecuta ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
8
8
8
2013-05-19 03:14:56 +0000

Para mí la opción -t no funcionó, pero -vframes funcionó. Prefiero usar #frames, ya que prefiero cortar en I-Frames y descubrí el GOP para video usando ffprobe.

La línea de comandos que me funcionó es:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

Por cierto, poner -ss al frente de -i hace una gran diferencia en el tiempo de ejecución.

5
5
5
2016-12-08 11:24:57 +0000

Al igual que con user225366, la opción -t no funciona para videos cortos, pero sí para videos más largos. Para los videos cortos parece que -frames:v es mejor. Esto es lo que funcionó para mí.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

-acodec copy necesita ser añadido si el video tiene audio, como muestran las otras respuestas.

0
0
0
2020-02-12 02:20:00 +0000

usa este formato:

ffmpeg <start time> <input file> <cut duration> <out file>

por ejemplo, corta un clip de 60 segundos después de 1 minuto de video

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

0
0
0
2019-09-01 05:29:02 +0000

Veo que no muchos mencionan esto (no soy un experto así que tal vez haya una trampa), pero si tu archivo tiene otros flujos como subtítulos y otros metadatos como capítulos y así sucesivamente, es posible cortar/cortar y mantener todos los flujos con el siguiente comando

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Con -map 0 tomas todos los flujos del archivo, y con -c copy copias todos como están.
Con -to omitiendo el inicio a través de -ss cortará el vídeo de entrada del inicio al segundo 60.

El corte con map es útil también si quieres que sólo se mantengan flujos específicos en el corte (tal vez no necesites todas las fuentes de audio del archivo, o sólo algunos subtítulos).

Lo uso cuando necesito dividir grandes archivos MKV que no se pueden almacenar en el almacenamiento FAT32.