Quiero un comando de búsqueda FFmpeg tan rápido y preciso. Encontré esto .
La solución es que aplicamos -ss
tanto para la entrada (búsqueda rápida) como para la salida (búsqueda precisa). Pero: si la búsqueda de entrada no es precisa, ¿cómo podemos estar seguros de que la posición de búsqueda es precisa?
Por ejemplo: si quisiéramos buscar 00:03:00, el comando es algo como:
ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>
El primero -ss
buscará otro lugar, no 00:02:30
, digamos 00:02:31
. Y después de aplicar la segunda búsqueda, el resultado final sería 00:03:01
, no lo que queremos. ¿Es eso correcto?
¿Dónde -ss
busca el primero ? ¿Busca el fotograma clave más cercano 00:02:30
?
Si es así, aquí está mi pensamiento: corríjame si me equivoco: después de la primera búsqueda, obtenemos la marca de tiempo del resultado (en este ejemplo:) 00:02:31
, luego aplicamos la segunda búsqueda con el tiempo apropiado, en este caso 00:00:29
.
La pregunta es: ¿cómo obtenemos la marca de tiempo del primer resultado de búsqueda?
ffprobe
. De lo contrario, cualquier formato intermedio funcionaría, por ejemplo, ProRes 422, DNxHD, que son visualmente sin pérdidas y solo dentro del marco. O usa algo como HuffYUV, etc. Pero, por supuesto, volvería a perder el aspecto "rápido".Unrecognized option 'select_streams'
select_streams
opción se agregó en octubre de 2012 . :) Podrías prescindir de eso, pero también obtendrías información para los cuadros de audio, mezclados entre ellos.Entiendo que esta pregunta tiene varios años, pero la última versión de ffprobe tiene la capacidad de omitir marcos . Puede pasar
-skip_frame nokey
para informar información solo en los fotogramas clave (I-frames). ¡Esto puede ahorrarle mucho tiempo! En un archivo MP4 de 2GB y 1080p, solía tomar 4 minutos sin omitir fotogramas. Agregar el parámetro de omisión solo lleva 20 segundos.Mando:
ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame = pkt_pts_time, pict_type D: \ test.mp4
Resultados:
Por lo tanto, los resultados solo contendrán información sobre los fotogramas clave.
fuente
Basándose en la respuesta de slhck , aquí hay una función bash que devolverá el fotograma clave más cercano que ocurre ANTES de los
N
segundos.Esto también se utiliza
-read_intervals
para garantizar que ffprobe solo comience a buscar su fotograma clave 25 segundos antes queN
segundos. Este truco y tener una salida awk cuando se encuentra la marca de tiempo acelera enormemente las cosas.ejemplo de uso:
Lo uso para recortar archivos de video sin volver a codificarlos. Como no puede agregar nuevos fotogramas clave sin volver a codificar, solía
ffnearest
buscar el fotograma clave antes de querer cortar. Aquí hay un ejemplo:Tenga en cuenta que para ese ejemplo, es posible que deba cambiar el formato de lo que se pasa en el
-ss
parámetro si está buscando más de los primeros 60 segundos.(molesto, decirle a ffmpeg que busque exactamente la marca de tiempo del fotograma clave parece hacer que ffmpeg excluya ese fotograma clave en la salida, pero restar 0,5 segundos de la marca de tiempo real del fotograma clave hace el truco. Para bash debe usar
bc
para evaluar expresiones con decimales , pero en zsh-ss 00:00:$[$(ffnearest input.mkv 28)-0.5]
funciona.)fuente
si desea obtener información de los cuadros I, puede usar
fuente