3 votos

ffmpeg - ¿Cómo puedo cortar a partir de un fotograma clave mientras se copia el códec?

El uso de -ss como opción de entrada junto con -c:v copy podría no ser precisa, ya que ffmpeg se ve obligado a utilizar/dividir sólo en fotogramas i. Aunque ajustará -si es posible- el tiempo de inicio del flujo a un valor negativo para compensar eso. Básicamente, si usted especifica "segundo 157" y no hay ningún fotograma clave hasta el segundo 159 incluirá dos segundos de audio (sin vídeo) al principio, y luego empezará desde el primer fotograma clave . Así que tenga cuidado al dividir y hacer la copia del códec copia.

Para evitar esto, he probado a encontrar primero las marcas de tiempo de los fotogramas necesarios para -ss y -to construyendo un mosaico de todos los marcos cercanos. He generado los azulejos utilizando

ffmpeg -i "INPUT.mkv" -ss 09:55 -t 3 -vf "drawtext=fontfile=I\\:\Misc\\\\~Software\\\\~OS\\\\I386\\\\arial.ttf: fontsize=60: text='F%{n}\(%{pict_type}\)\@%{pts\:hms}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1,scale=320:-1,tile=layout=12x10" tiles%03d.png

y según ellos el fotograma clave necesario debería empezar a partir de las 00:09:56.012, y el último fotograma necesario debería estar en las 00:10:00.224. Sin embargo, el fragmento creado al cortar con estas marcas de tiempo

ffmpeg -i "INPUT.mkv" -map 0:0 -map 0:4 -map 0:5 -map 0:6 -ss 09:56.012 -to 00:10:00.224 -vcodec copy -acodec copy J01.mkv

comienza en un fotograma no clave (sólo sonido) y termina también en un lugar equivocado. Por el contrario, el corte del mismo fragmento en Avidemux funciona bien incluso con los ajustes de salida de vídeo y audio establecidos en Copy (IIUC, sin recodificación y partiendo de un fotograma sin clave). Marcas de tiempo mostradas en Avidemux también son diferentes ( -ss 09:56.346 -to 10:00.558 v.s. -ss 09:56.012 -to 10:00.224 ).

También he probado a cortar por pkt_dts_time ( https://stackoverflow.com/questions/14005110/ ), pero eso tampoco funcionó.

p.d. Otro procedimiento similar a lo que estoy tratando de hacer (al mencionado Avidemux) es cuando en Sony Vegas se hace un zoom en la línea de tiempo hasta que se puede pasar de un fotograma a otro, entonces se establece el primer fotograma después del cambio de escena (que también es un fotograma clave) como punto de partida y el último fotograma de la misma escena (después del cual viene el siguiente fotograma clave que no es necesario) como punto final y luego se renderiza. Algo así también se puede hacer en Avidemux mientras se copian también los flujos de vídeo y audio.

edit1: Aquí está el registro de -copyts versión: pastebin . com /Cxzrc8Er. ¿Debo hacer otros también?


edit2: Aquí están los resultados de "PATHTO\ffprobe.exe" -select_streams v -show_entries packet=pts_time,flags -of compact -read_intervals 580%600 "INPUT.mkv" | findstr K .

packet|pts_time=578.160000|flags=K
packet|pts_time=581.205000|flags=K
packet|pts_time=583.499000|flags=K
packet|pts_time=585.042000|flags=K
packet|pts_time=588.671000|flags=K
packet|pts_time=594.885000|flags=K
packet|pts_time=596.012000|flags=K

También he probado todo el combo de comandos (mosaicos, listar los fotogramas de esta manera, cortar el fragmento de dos maneras diferentes) en otros 2 videos, y los resultados son similares. Los tiempos de los fotogramas clave listados en la terminal usando tu comando sugerido coinciden con los de los azulejos hechos por el mío; y generalmente el corte por mi método deja una pequeña sección congelada (~1s) al principio y a veces varios fotogramas no deseados al final y el corte por tu método deja un flujo de vídeo vacío más largo al principio.

También he encontrado un fragmento de vídeo mejor para experimentar porque es visualmente más fácil determinar cuánto de los fotogramas deseados faltan y de los no deseados se han añadido (imgur.com /a /DTzmt, la parte relevante se puede descargar en bit.ly /Kmnz112f1). Su solución también funcionó mejor en él.

Además, sólo para estar seguros: ¿Querías decir -ss 09:56.01 3 y no -ss 09:56.01 2 en su solución original? Y, ¿estoy en lo cierto al suponer que en general funciona en los vídeos que estás cortando y que en los míos no es habitual?


0voto

Mulvya Puntos 156

Prueba con

ffmpeg -ss 09:56.013 -i "INPUT.mkv" -map 0:0 -map 0:4 -map 0:5 -map 0:6 -to 00:10:00.224 -vcodec copy -acodec copy -avoid_negative_ts make_zero J01.mkv

0voto

Ondra Žižka Puntos 327

Una solución podría ser:

  1. Corta los primeros, digamos, 5 segundos del clip (es decir, donde quieras cortar)
  2. Codificarla utilizando el mismo códec que tiene la entrada
  3. Utilizarlo como capa 1
  4. Copiar el clip con el códec copy como capa 2
  5. Superponer la capa 1 sobre la capa 2.

Esto puede ser más lento que sólo copiar.

Otra solución podría ser encontrar el primer fotograma clave, y concatenar dos clips:

  • Uno desde el inicio del clip hasta el fotograma clave, codificado con el mismo códec
  • Otro desde el fotograma clave hasta el final del clip, utilizando el códec copy .

No he probado ninguno de los dos (todavía).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X