Cortar una parte del archivo .avi no es exacto si la salida se especifica como archivo .avi (pero si la salida se especifica como archivo .mp4, sí lo es)

Cortar una parte del archivo .avi no es exacto si la salida se especifica como archivo .avi (pero si la salida se especifica como archivo .mp4, sí lo es)

Estoy tratando de cortar una parte de.aviarchivo usando el comando

ffmpeg -ss 346 -i input.avi -t 5 -c copy -y output.avi

La duración total del vídeo de salida es de unos 13 segundos, 8 segundos más de lo necesario. Pero si la extensión del archivo de salida se especifica como.mp4, entonces el corte es preciso. Me gustaría entender por qué sucede esto.

Se agradece cualquier ayuda.

Respuesta1

AVI y MP4 son contenedores para flujos de datos, siendo MP4 mucho más capaz.

El contenedor MP4 le permite crear "cortes" precisos a partir de una secuencia de vídeo de origen en fotogramas que no son clave, sin volver a codificar, mediante el uso interno de unlista de edición.

Por ejemplo, supongamos que desea copiar de su vídeo fuente entre 346 y 351 segundos (que es lo que parece que está haciendo). Si el fotograma clave más cercano antes de 346 s está en 338 s, entonces ffmpeg en realidad copia el video comenzando en 338 s, pero usa la magia de la lista de edición de MP4 para indicarle a los reproductores multimedia que se salten los primeros 8 segundos.

La misma lógicapodríaTambién se aplica al final de un corte (no estoy seguro, habría que probarlo). Si es así, la lista de edición también indicaría a los reproductores multimedia que dejen de reproducir antes.

AVI no admite listas de edición como lo hace MP4, por lo que con el contenedor AVI verás el corte completo de 13 segundos.

Espero que esto tenga sentido. Deje un comentario si tiene preguntas e intentaré aclararlas.

EditarHe creado un diagrama para intentar mostrar visualmente lo que está haciendo ffmpeg:

Cómo corta ffmpeg cuando no estás recodificando

información relacionada