Me gustaría cortar videos usando ffmpeg para aprendizaje automático.
¿Cómo puedo asegurarme de que si corto (por ejemplo) 1 segundo de video a 25 fps, esto proporcionará exactamente 25 cuadros de audio y video sincronizados?
He visto que ffmpeg busca fotogramas clave en el momento del corte y elige el más cercano. Tuve problemas porque generaba marcas de tiempo negativas y llenaba el final del video cortado con fotogramas copiados.
Entiendo que los metadatos no muestran fps reales, etc.
Entonces, ¿cuál sería el camino para obtener cortes precisos con la cantidad exacta de fotogramas alineados con el flujo de audio?
Gracias
Respuesta1
Dependiendo del códec y el contenedor del vídeo, esto puede requerir algunos pasos contrarios a la intuición: muchos códecs simplemente no permiten directamente puntos de entrada y salida aleatorios.
- En primer lugar, necesita cortar el video (ignorando el audio por un momento); esto se hace mejor usando
-ss inpoint
y-pix_fmt yuv420p -an -f yuv4mpegpipe -frames:v 25
canalizando unax264
u otra instancia de ffmpeg. Esta ha demostrado ser una forma confiable de cortar la transmisión de video con precisión de fotograma. - Para el audio, la forma más sencilla es convertir a
-c:a pcm_s16le
y '-f s16le', luego manipular el resultado a nivel de archivo para que contenga la cantidad correcta de bytes desde el desplazamiento correcto. - Una última
ffmpeg
pasada puede comprimir el audio si es necesario o simplemente mezclarlo con el vídeo. Dado que el PCM sin formato no contiene marcas de tiempo, no existe posibilidad de asincronía.
Esto ha demostrado ser una forma fiable de colocar vídeos de fuentes dudosas (es decir, clips comerciales de algún anunciante) en un flujo lineal altamente regulado (es decir, un canal de televisión) sin introducir ningún artefacto.