cortar con ffmpeg da como resultado unos pocos segundos de pantalla negra, ¿cómo soluciono esto?

8

Estoy usando este comando para cortar un segmento de un video desde la línea de comando

ffmpeg -i %1 -vcodec copy -acodec copy -ss %2 -t %3 %~n1_cut%~x1

y lo llamo como

cut.bat video.mp4 001:23:45:678 10

y como se esperaba, obtengo un video_cut.mp4 con 10 segundos del video original, el problema es que unos pocos segundos del archivo resultante es una pantalla negra con audio, ¿por qué sucede esto y cómo lo soluciono?

algún chico
fuente
% ~ n1_cut% ~ x1 ¿qué significa esta parte del comando?
ScipioAfricanus
@ScipioAfricanus %~n1expande% 1 a un Nombre de archivo, o si solo está presente una ruta (sin barra diagonal inversa) - la última carpeta en esa ruta y %~x1expande% 1 a una extensión de archivo solamente - .txt fuente: superuser.com/questions/ 224416 / ...
Shayan

Respuestas:

8

La mayoría de los videos usan códecs que realizan compresión temporal, por lo que un punto de corte específico puede basarse en fotogramas antes (y después) de ese punto de corte para que se decodifiquen correctamente. Entonces, cuando usa ffmpeg para recortar videos y usar el copymodo, ffmpeg tiene que incluir todos los cuadros antes y después del segmento recortado que son necesarios para decodificar el segmento correctamente.

Entonces, tiene dos opciones, use el modo de copia pero configure un interruptor que permitirá a todos los jugadores reproducir correctamente estos archivos

ffmpeg -ss %2 -t %3 -i %1 -vcodec copy -acodec copy -avoid_negative_ts make_zero %~n1_cut%~x1

(esto probablemente dará como resultado una salida que comienza antes de su punto de corte)

o volver a codificar las transmisiones

ffmpeg -ss %2 -t %3 -i %1 %~n1_cut%~x1
Gyan
fuente
Aunque la codificación es más lenta, producirá mejores resultados, porque con la otra solución, el video podría ser más largo de lo que se especificó en la -topción.
totymedli
@Gyan ¿Qué hace %? Intenté buscar en ffmpeg.org/ffmpeg.html pero no encuentro el uso.
Shayan
Como su respuesta sugirió, usé ambos -ssy -tantes -iy funcionó, antes, solo puse -ssantes -iy -testaba después, así que no funcionó.
Shayan
1

https://github.com/mifi/lossless-cut/pull/13

Cuando ejecuto ffmpeg con los argumentos en este orden -i ... -ss ... -t ..., produce un archivo de video que no tiene video durante unos segundos iniciales. (por lo que puedo entender, ¿esto se debe a que no busca un fotograma clave?)

Si cambio el orden a -ss ... -i ... -t ..., los videos cortados resultantes se reproducen correctamente.

Mi ffmpeg -version

Gerard Wensink
fuente
Lo intenté -ssantes -ipero no funcionó en mi archivo mp4.
Shayan
Trabajó para mí, gracias. Simplemente cambió el orden de los parámetros. ffmpeg versión 3.2.12-1 ~ deb9u1
shukshin.ivan
En realidad, esto solo mueve la duración en blanco al final del video
Honghao Zhang,