corte preciso de video (+ audio) con ffmpeg

10

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.2no ayudó.

EDITAR: cambié el recorte para usar en -c:v libx264 -c:a aac -strict experimentallugar de -codec:v copy -codec:a copycon 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í?

Pete Oakey
fuente
Esto podría tener que ver con el momento de los fotogramas clave. En cualquier caso, esto debería trasladarse a SuperUser.com.
Brad
Hola, ffmpeg no puede cortar el video en ningún momento, solo puede cortar en fotogramas clave; Por esta razón, el audio es casi preciso, mientras que el video no lo es.
¿Puedo moverlo yo mismo? Intentaré agregar fotogramas clave al archivo fuente con -force_key_frames 00: 00: 00.2
Pete Oakey

Respuestas:

9

El comportamiento de los -sscambios 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.mp4usar la -crfopció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:

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

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 puede escalar sin volver a codificar, por lo tanto, se excluye mutuamente -codec:v copyy, 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. 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.mp4a través de qt-faststart(que se encuentra en el directorio de herramientas de fuente de FFmpeg), o utilice la -movflags faststartopción. Esto reubicará algunos datos al comienzo del archivo para que pueda comenzar la reproducción antes de que se descargue por completo.

lema
fuente
+1 para los consejos pero probé ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c copy -map 0 clip1.mp4 pero la primera parte (casi un segundo) y la última parte (quizás un cuarto de segundo) del se pierde el video, aunque el audio está bien.
Pete Oakey el
@PeteOakey ¿Ha intentado cortar sin una copia de flujo de bits, pero una real codificación?
slhck
Probé sin copia de flujo de bits: los resultados se agregaron a mi pregunta.
Pete Oakey
3
Usar -sscomo 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 por ffprobe -show_frames). Mover -ssdespués -ihizo que
emitiera