Quiero que mi sitio web permita a los usuarios crear con precisión sus propios clips de un video fuente que proporciono.
Tengo un archivo de video fuente que primero quiero convertir a 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
Ver este video es de buena calidad y 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 inicio y un punto final 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. 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 que esto sea preciso y sincronizado para decir, 0.2 de segundo?
EDITAR: Agregar -force_key_frames 00:00:00.2
no ayudó.
EDITAR: cambié el recorte para usar en -c:v libx264 -c:a aac -strict experimental
lugar de -codec:v copy -codec:a copy
con buenos (ish) resultados.
El archivo puede reproducirse 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 video? ¿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 reproduce con precisión sin problemas con un reproductor como MPC o Windows Media Player 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í?
Respuestas:
El comportamiento de los
-ss
cambios depende de si se usa como una opción de entrada o salida, y a menudo es más lento pero puede ser más preciso cuando se usa como una opción de salida. Vea la respuesta a ffmpeg convierte el video de un período de tiempo específico lentamente para obtener más detalles y ejemplos.Para cambiar la calidad de salida para
source.mp4
usar la-crf
opción con un valor entre 18-28 (23 es el valor predeterminado). Consulte la sección CRF de la Guía de codificación FFmpeg y x264 para obtener ejemplos.Su comando de recorte se puede simplificar:
Reemplacé
-codec:v copy -codec:a copy
con-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 puede escalar sin volver a codificar, por lo tanto, se excluye mutuamente-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:
Será más lento, pero probablemente más preciso. Vea 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, se debe ejecutar
source.mp4
a través deqt-faststart
(que se encuentra en el directorio de herramientas de fuente de FFmpeg), o utilice la-movflags faststart
opción. Esto reubicará algunos datos al comienzo del archivo para que pueda comenzar la reproducción antes de que se descargue por completo.fuente
-ss
como opción de salida en lugar de la opción de entrada solucionó mi problema: el primer cuadro de video tenía alrededor de 1 segundo en el video de salida, con solo audio antes (también confirmado porffprobe -show_frames
). Mover-ss
después-i
hizo que