¿Cómo cortar en cuadros exactos usando ffmpeg?

22

Estoy tratando de usar ffmpeg para cortar archivos de video en momentos precisos. La ayuda de ffmpeg muestra una opción -timecode_frame_start para especificar el marco inicial, pero no puedo hacer que este comando funcione. El video resultante siempre comienza al comienzo del video original. Aquí hay un ejemplo del comando que estoy ejecutando:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

He movido la opción timecode_frame_start antes y después de las otras opciones sin ningún cambio en los resultados. ¿Hay alguna opción adicional que deba especificar? He probado varios formatos de archivo, mkv, avi, mp4, y no parece que el problema esté relacionado con el códec. Aquí hay un archivo que he probado:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

¿Me estoy perdiendo de algo?

curmil
fuente
parece que esto fue respondido en la lista de correo (y NB que con la copia -vcodec no se puede "realmente" obtener un corte específico del cuadro, ya que solo puede resincronizarse en i-frames
rogerdpack
@ user39364 Le pregunté en la lista de correo y resulta que esta opción no hace lo que quiere el OP. También aprendí algo nuevo :)
slhck
Solo quería señalar que encontré un método para cortar en cuadros exactos usando melt, vea Cortar con precisión archivos de video desde la línea de comandos
Superusuario

Respuestas:

46

Acabo de enterarme de que timecode_frame_startno funciona así. La única forma de comenzar en cuadros específicos es convertir varios cuadros a ss.mssintaxis, o hh:mm:ss.ms. Entonces, si su video está a 25 fps, y desea comenzar a 133 cuadros, necesitaría

133/25 = 5,32

Entonces, corre

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Tenga en cuenta que -c:v copyno es posible cortar fotogramas exactos con copia de flujo de bits ( ) ya que no todos los fotogramas están intracodificados y pueden ser independientes.

-ss siempre será con precisión de cuadro.

Si desea codificar un número específico de cuadros, use -frames:v, por ejemplo:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

También tiene la opción de usar filtros de video , pero el soporte de audio puede no ser exacto. Y aparentemente, buscar en marcos todavía no es una característica. Puede seguir este hilo de la lista de correo de usuarios de FFmpeg para obtener más información:

puede usar -vf selectpara una selección precisa de cuadros (algo así como -vf 'select=gte(n\,100)'omitir los 100 primeros cuadros)

slhck
fuente
3
para videos con cuadros sueltos (por ejemplo, 29.97 fps) que duran más de 10 minutos; ¿cómo harías para calcular con precisión el tiempo de un fotograma en particular?
GFoley83
el select=gte(n\,100)método funciona, pero la búsqueda está consumiendo el rendimiento. Si prueba al codificar solo 30 cuadros a la vez, cuanto más avance en el video, más tiempo tardará en completarse ffmpeg debido a la búsqueda.
Adam Grant
6

La opción

-vf select = "entre (n \, start_frame_num \, end_frame_num ), setpts = PTS-STARTPTS"
p.ej,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

corta el video de (incluye) fotograma 200 a (incluye) fotograma 300, el recuento de secuencias comienza desde 0.

Nuo Chen
fuente