Usando ffmpeg para cortar video


335

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 -ssparte funciona bien pero -tse ignora. Elimina correctamente los segundos especificados iniciales especificados con, -sspero luego continúa hasta el final de la entrada con la copia.

¿Hay alguna manera de usar ffmpeg para cortar el final de un video sin recodificarlo?


1
Esta sintaxis es correcta.
jiggunjer

Respuestas:


396

Puede usar la -ssopción para especificar una marca de tiempo de inicio y la -topción para especificar la duración de la codificación. Las marcas de tiempo deben estar en HH:MM:SS.xxxformato o en segundos ( s.msec).

Lo siguiente recortaría los primeros 30 segundos, y luego recortaría todo lo que sea 10 segundos después de eso:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Tenga en cuenta que -tes una opción de salida y siempre debe especificarse después -i .

Algunos consejos:

  • Para versiones anteriores de ffmpeg, si usa -ssdespués -i, obtendrá una búsqueda más precisa a expensas de una ejecución más lenta por completo. Ver también: Buscando con FFmpeg
  • Puede usar en -tolugar de -tespecificar la marca de tiempo a la que desea cortar. Entonces, en lugar de -i <input> -ss 30 -t 10usted, también podría hacer -i <input> -ss 30 -to 40lo mismo.

  • Si su ffmpeg no es compatible -c, o -toes probable que esté muy desactualizado. Compile una nueva versión usted mismo o descargue una compilación estática desde su página de inicio. Realmente no es complicado.


1
@Mondain En realidad, obtienes más precisión al poner -ss después. Y slhck menciona esto aquí blog.superuser.com/2012/02/24/… también en la documentación de ffmpeg para -ss menciona una diferencia entre ponerlo antes o después.
barlop

55
+1 Vine aquí para descubrir cómo ignorar todo después de los primeros 35 segundos, gracias:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
Esto no funciona para mí (mp4). Solo produce una pantalla negra de 5 segundos:frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
relojero

2
Esto produjo una pantalla negra de 3-4 s al comienzo de mi video clip. La modificación de Chris con la omisión -c copyeliminó la pantalla negra inicial, vea su respuesta para más detalles.
joelostblom

44
Escribe "Lo siguiente recortaría los primeros 30 segundos, y luego recortaría todo lo que sea 10 segundos después de eso:" <- ¿Qué significa eso? ¿Por clip quiere decir incluir? 'cos clip puede significar recortar. Suponiendo que te refieres a incluir. ¿Te refieres a comenzar desde 30 segundos e incluir solo 10 segundos a partir de ahí? Si es así, te sugiero que escribas que sería mucho más claro.
barlop

95

Como otras personas mencionaron, poner -ssantes (mucho más rápido) o después (más preciso) -ihace una gran diferencia. La sección "Búsqueda rápida y precisa" en la página de búsqueda de ffmpeg le dice cómo obtener ambos, y lo he usado, y hace una gran diferencia. Básicamente pones -ssantes Y después del -i, solo asegúrate de dejar suficiente tiempo antes de comenzar a cortar para tener otro cuadro clave. Ejemplo: si desea hacer un clip de 1 minuto, de 9min0sec a 10min 0sec en Video.mp4, puede hacerlo de manera rápida y precisa utilizando:

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

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

También tenga en cuenta este punto importante de esa página: "Si usa -sscon -c:v copy, el flujo de bits resultante podría terminar entrecortado, no reproducible o no sincronizado con la transmisión de audio, ya que ffmpeg se ve obligado a usar / dividir solo en i-frames. "

Esto significa que debe volver a codificar el video, incluso si solo desea copiarlo, o arriesgarse a que esté entrecortado y fuera de sincronización. Podrías intentarlo solo -c copyprimero, pero si el video apesta, tendrás que volver a hacerlo.


la misma advertencia se aplica a -c:a copyesta forma de búsqueda.
jiggunjer

1
La mejor respuesta, de esta manera funcionó mejor para mí.
Ondra Žižka

3
Parece que "-ss" ahora es rápido y preciso en ffmpeg 2.1+ sin especificarlo dos veces. trac.ffmpeg.org/wiki/Seeking
Conrad Meyer

25

Encontré que -sscombinado con -c copyresultó en un corte de medio segundo al comienzo.

Para evitar eso, debe eliminar el -c copy(que ciertamente hará una transcodificación).


44
Hay otra respuesta que trata con precisión. ¡Re-codificar con la opción predeterminada a menudo NO es lo que quieres hacer!
Tomasz Gandor

Buen punto @TomaszGandor
Chris

1
No entendí la respuesta de @ TomaszGandor en absoluto, pero la eliminación la -c copyarregló.
Iulian Onofrei

Si usa -c copy mantendrá los fotogramas clave originales y su posición. El "tiempo perdido" al inicio depende del espacio entre los fotogramas clave.
user1323995

13

A MANO

Abra el archivo en un reproductor multimedia que avance cuadro por cuadro y reproduzca 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 corte con el formato de hora 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 haga 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'

Ejecute ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

Si usa -c copy mantendrá los fotogramas clave originales y su posición. Tus videos se cortarán a esos fotogramas clave, así que no, el tiempo no será exacto.
user1323995

9

Para mí, la -topción no funcionó, pero -vframesfuncionó. Prefiero usar #frames, ya que preferiría cortar en I-Frames y descubrí GOP para usar videos ffprobe.

La línea de comando que funcionó para mí es:

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

Por cierto, poner -ssal frente -ihace una gran diferencia en el tiempo de ejecución.


1
En realidad -vframes(o -frames:v) debería venir después -iporque es una opción de salida.
slhck

5

Al igual que con user225366, la opción -t no funciona para videos cortos, pero sí para videos más largos. Para 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

Se necesita agregar una copia de códec si el video tiene audio, como muestran las otras respuestas.


0

Veo que no muchos mencionan esto (no soy un experto, así que tal vez haya una trampa), pero si su archivo tiene otras secuencias como subtítulos y otros metadatos como capítulos, etc., es posible cortar / recortar y mantener todas las secuencias con el siguiente comando

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

Con -map 0usted, tome todas las secuencias del archivo y con -c copytodas las copias tal como están.
Si se -toomite el inicio a través, -ssse cortará el video de entrada desde el inicio hasta el segundo 60.

mapTambién es útil jugar con si desea que solo se mantengan secuencias específicas en el corte (tal vez no necesite todas las fuentes de audio en el archivo o solo algunos subtítulos).

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.