ffmpeg para dividir el archivo mp4 en segmentos... después del primer segmento, audio no sincronizado

ffmpeg para dividir el archivo mp4 en segmentos... después del primer segmento, audio no sincronizado

Nb: yo incorrectamentehizo esta preguntaen desbordamiento de pila

He usado la línea de comando ffmpeg que se muestra enesta preguntadividir archivos MKV perfectamente durante mucho tiempo. Ahora tengo algunos archivos MP4 que me gustaría dividir y al principio parecía funcionar, ¡pero en cada segmento posterior al primero el audio no está sincronizado! Y por varios segundos.

Intenté forzar fotogramas clave (consejo que encontré en otros sitios) y eso no ayudó.

Probé un programa completamente diferente (Avidemux) y pude dividir el archivo con la salida adecuada, pero fue MUCHO más lento, tomando más de 3 minutos frente a menos de 2 segundos con ffmpeg. Con Avidemux pude determinar la posición exacta del i-frame donde quería dividir, así que pensando que tal vez ese era el problema de sincronización, probé esa posición exacta (es decir, 00:12:17.111 en lugar de 00:12:16 o lo que sea) pero eso tampoco ayudó.

¿Hay alguna opción que me falta con ffmpeg para que sincronice correctamente el audio con el video al dividir?

Solo una nota: estaba usando una versión 2013 de ffmpeg. Acabo de actualizarlo a la última versión 2.6 pero el problema persiste.

Respuesta1

Según la documentación, el indicador -ss hace cosas diferentes dependiendo de dónde se encuentre en el comando

-ss posición (entrada/salida) Cuando se usa como opción de entrada (antes de -i), busca en este archivo de entrada la posición. Tenga en cuenta que en la mayoría de los formatos no es posible buscar exactamente, por lo que ffmpeg buscará el punto de búsqueda más cercano antes de la posición. Cuando la transcodificación y -accurate_seek están habilitados (el valor predeterminado), este segmento adicional entre el punto de búsqueda y la posición se decodificará y descartará. Al realizar una copia de secuencia o cuando se utiliza -noaccurate_seek, se conservará.

Cuando se utiliza como opción de salida (antes de un nombre de archivo de salida), decodifica pero descarta la entrada hasta que las marcas de tiempo alcancen la posición.

La posición puede estar en segundos o en formato hh:mm:ss[.xxx].

Entonces, según su propia respuesta, el primer comando aplica la lógica en la salida y el segundo comando la aplica en la entrada.

Respuesta2

No estoy seguro de entender POR QUÉ, pero el problema era el orden de los parámetros.

En el ejemplo vinculado, el comando es el siguiente:

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

Por supuesto, estoy usando mp4 en lugar de avi, pero por lo demás estaba ingresando el comando exactamente como se indicó anteriormente y (con mp4) obtenía un resultado de audio no sincronizado. Accidentalmente me topé con esta "solución"... si en lugar de eso ingreso el comando de esta manera:

ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4

No entiendo los problemas de sincronización. ¿Por qué? Ni idea. Pero funciona. Lo intenté varias veces para confirmar... hacer solo ese cambio de orden de parámetros corrige el problema.

información relacionada