corte preciso de video (+ audio) con ffmpeg

corte preciso de video (+ audio) con ffmpeg

Quiero que mi sitio web permita a los usuarios crear con precisión sus propios clips a partir de un vídeo fuente que proporciono.

Tengo un archivo de vídeo de origen que primero quiero convertir en algo adecuado para un sitio web:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

Yo uso ffmpeg para convertirlo así:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

Viendo este video nuevamente, tiene una calidad suficientemente buena y un tamaño de archivo lo suficientemente pequeño para mis necesidades, y se carga/reproduce en mi sitio web.

Tengo una página web que permite a los usuarios seleccionar un punto de inicio y finalización en este video y crear un clip. Aquí hay un ejemplo del comando ffmpeg que uso para eso:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

El problema es que el clip no siempre es lo suficientemente preciso en el tiempo. Por lo general, el audio es lo suficientemente preciso, pero el video se detiene medio segundo antes o algo así.

¿Hay alguna manera de hacer esto preciso y sincronizado, digamos, 0,2 segundos?

EDITAR: Agregar -force_key_frames 00:00:00.2no ayudó.

EDITAR: cambié el recorte para usarlo -c:v libx264 -c:a aac -strict experimentalen lugar de -codec:v copy -codec:a copycon buenos (más o menos) resultados.

El archivo se puede reproducir externamente sin problemas, pero cuando lo cargo en mi elemento de video html5 y lo reproduzco, la última parte del video (el audio está bien) se congela. La última parte que se congela dura menos de un segundo.

¿Debería probarlo con otro codificador de vídeo? ¿Cuál es la mejor alternativa para libx264? Teniendo en cuenta que probablemente querré que esto esté en un sitio web público.

Pero espera, ¿el hecho de que se reproduzca con precisión y sin problemas con un reproductor como MPC o Windows Media Player no sugiere que es un problema con Google Chrome o el elemento de video HTML? ¿O estoy usando una codificación no compatible o algo así?

Respuesta1

El comportamiento de -sslos cambios depende de si se usa como opción de entrada o de salida y, a menudo, es más lento, pero puede ser más preciso cuando se usa como opción de salida. Ver la respuesta affmpeg convierte lentamente videos de un período de tiempo específicopara más detalles y ejemplos.

Para cambiar la calidad de salida, source.mp4utilice la -crfopción con un valor entre 18 y 28 (23 es el valor predeterminado). Consulte la sección CRF delGuía de codificación FFmpeg y x264por ejemplo.

Su comando de recorte se puede simplificar:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

Lo reemplacé -codec:v copy -codec:a copycon -c copy -map 0. Esto copiará todas las transmisiones en lugar de solo las primeras transmisiones de video y audio, aunque la entrada solo tiene dos transmisiones debido a su comando anterior. Como no se puede escalar sin volver a codificar, por lo que es mutuamente excluyente -codec:v copy, y dado que su entrada ya está escalada al tamaño establecido, eliminé las opciones de filtro.

Si aún no es lo suficientemente preciso, intente:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

Será más lento, pero probablemente más preciso. Consulte los enlaces en la respuesta en el primer enlace que proporcioné para obtener una descripción de las diferencias de estos dos ejemplos.

Por último, debe ejecutar source.mp4( qt-faststartubicado en el directorio de herramientas en la fuente ffmpeg) o usar la -movflags faststartopción. Esto reubicará algunos datos al principio del archivo para que pueda comenzar a reproducirse antes de que se descargue por completo.

información relacionada