Pregunta 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

los -ss parte funciona bien pero el -t es ignorado Elimina correctamente los segundos iniciales especificados especificados con -ss pero 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?


249


origen


esta sintaxis es correcta - jiggunjer
stackoverflow.com/questions/18444194/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Respuestas:


Puedes usar el -ss opción para especificar una marca de tiempo de inicio, y la -t opción para especificar la duración de la codificación. Las marcas de tiempo deben estar en HH:MM:SS.xxx formato o en segundos (s.msec)

Lo siguiente sería recortar los primeros 30 segundos, y luego recortar 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 -t es una opción de salida y siempre necesita ser especificada después  -i.

Algunos consejos:

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

  • Si tu ffmpeg no es compatible -c, o -to, es probable que esté muy desactualizado. Compila una nueva versión usted o descargar una construcción estática desde su página de inicio. Realmente no es complicado.


301



@Mondain En realidad, obtienes más precisión colocando el -ss después. Y slhck menciona esto aquí blog.superuser.com/2012/02/24/...  también en la documentación de ffmpeg para -ss se menciona una diferencia entre ponerlo antes o después. - barlop
+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
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 - clocksmith
Esto produjo una pantalla negra de 3-4 s al comienzo de mi video clip. La modificación de Chris con omisión -c copy eliminó la pantalla negra inicial, ver su respuesta para más detalles. - Joel Ostblom
Usted escribe "Lo siguiente recortaría los primeros 30 segundos, y luego recortar todo lo que sea 10 segundos después de eso:" <- ¿Qué significa eso? Por clip ¿quieres decir incluir? 'cos clip puede significar clip out. Suponiendo que quieras incluir. ¿Quiere decir comenzar desde 30 segundos, e incluir solo 10 segundos desde allí? Si es así, te sugiero que escribas que sería mucho más claro. - barlop


Como otras personas mencionaron, poniendo -ss antes (mucho más rápido) o después (más preciso) -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 obtener ambas, y la he usado, y eso hace una gran diferencia. Básicamente pones -ss antes Y después del -i, solo asegúrate de dejar el tiempo suficiente antes de donde quieras comenzar a cortar para tener otro marco clave. Ejemplo: Si desea hacer un clip de 1 minuto, de 9min0sec a 10min 0sec en Video.mp4, puede hacerlo de forma 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 -ss busca rápido a (aproximadamente) 8min0sec, y luego el segundo -ss busca con precisión a 9min0sec, y el -t 00:01:00 saca un clip de 1 minuto0.

También tenga en cuenta este punto importante de esa página: "Si usa -ss con -c:v copy, el flujo de bits resultante puede terminar entrecortado, no reproducible o fuera de sincronización con la transmisión de audio, ya que ffmpeg está forzado a usar / dividir solo en i-frames. "

Esto significa que necesita volver a codificar el video, incluso si solo quiere copiarlo, o arriesgarse a que esté entrecortado y fuera de sincronización. Podrías probar solo -c copy primero, pero si el video es una mierda necesitarás volver a hacerlo.


69



la misma advertencia se aplica a -c:a copy por esta forma de buscar. - jiggunjer
La mejor respuesta, de esta manera funcionó lo mejor para mí. - Ondra Žižka


encontre eso -ss combinado con -c copy resultó en una tajada de medio segundo al comienzo.

Para evitar eso, debes eliminar el -c copy (lo que ciertamente hará un transcodificador).


16



Hay otra respuesta que se refiere a la precisión. ¡Volver a codificar con la opción predeterminada a menudo NO es lo que quieres hacer! - Tomasz Gandor
Buen punto @TomaszGandor - Chris


A MANO

Abra el archivo en un reproductor multimedia que avance cuadro a cuadro y reproduzca Archivo AVISynth con datos tales 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 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 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"

12





Para mi -t la opción no funcionó, pero -vframes trabajó. Prefiero usar #frames, ya que preferiría cortar en I-Frames y descubrí GOP para video usando 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, poniendo -ss En frente de -i hace una gran diferencia en el tiempo de ejecución.


7



Actualmente -vframes (o -frames:v) debería venir después -i porque es una opción de salida. - slhck


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

-la copia del código debe agregarse si el video tiene audio, como muestran las otras respuestas.


1