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

2

Nb: hice esta pregunta incorrectamente en stackoverflow

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

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

Intenté un programa completamente diferente (Avidemux) y fue capaz de dividir el archivo con la salida adecuada, pero fue MUCHO más lento, y tardó 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 dividirme, 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 una opción que me falta con ffmpeg para sincronizar correctamente el audio con el video cuando se divide?

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

bcsteeve
fuente
2
La próxima vez, incluya la salida completa de la línea de comando sin cortar del comando de conversión.
slhck

Respuestas:

1

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

-ss position (input / output) Cuando se usa como una 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 se habilita la transcodificación y -accurate_seek (el valor predeterminado), este segmento adicional entre el punto de búsqueda y la posición se decodificará y descartará. Al hacer una copia de flujo o cuando se utiliza -noaccurate_seek, se conservará.

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

la posición puede ser en segundos o en hh: mm: ss [.xxx].

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

Matthew Steeples
fuente
1

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 de lo contrario estaba ingresando el comando exactamente como se indica arriba y (con mp4) estaba obteniendo un resultado de audio no sincronizado. Accidentalmente tropecé con esta "solución" ... si en su lugar 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 consigo los problemas de sincronización. ¿Por qué? Ni idea. Pero funciona. Lo he intentado varias veces para confirmar ... hacer solo ese cambio en el orden de los parámetros corrige el problema.

bcsteeve
fuente
Realmente no debería hacer una diferencia, y si es que lo hubiera hecho, habría asumido que el primer comando funcionó mejor. Si puede proporcionar un archivo de muestra, comprobaré y crearé un informe de error si es necesario.
slhck
De acuerdo en que no debería hacer una diferencia, pero ciertamente lo hace. Intentaré conseguirte un archivo de muestra para que puedas recrearlo.
bcsteeve
Gracias por esto. Nunca lo habría descubierto yo solo
Matthew Steeples
Investigué un poco ahora que sé la respuesta para tratar de encontrar la razón, y publiqué mi propia respuesta con lo que he encontrado
Matthew Steeples, el