Reemplace partes de video con otro video con ffmpeg

3

Tengo unas pocas horas de video MP4 (h264 + AAC) y necesito reemplazar pequeñas partes de este con otro video (o solo audio). La razón es que el archivo es una grabación de una sesión en vivo y necesito bloquear / silenciar partes de él antes de publicarlo.

Me gustaría usar ffmpeg. He encontrado mucha información sobre el complejo de filtros, concat, etc. pero me gustaría saber si hay una forma más sencilla antes de analizar todo esto. O al menos una pista de qué funcionalidad de filter_complex debería usar.

Hasta ahora lo hago a mano en Premiere Elements, donde tomo el video principal y pongo otro clip en la segunda pista. Y me gustaría automatizar todo el proceso ...

Radek Hladík
fuente
¿Tiene una lista de dónde y cuánto tiempo debe hacerse esto?
Gyan
Sí, la "entrada" de este proceso es una lista de veces (desde-hasta o desde + longitud) para "anonimizar". Y crearé alguna forma de herramienta que llamará a ffmpeg para hacerlo ...
Radek Hladík
Entonces, ¿se oscurecerán esas partes del video o se reemplazarán con otro video? Del mismo modo para audio, silenciado u otro audio?
Gyan
Me gustaría reemplazarlos con un breve video clip y me gustaría elegir si reemplazo el audio y / o la pista de video. Ese clip corto probablemente será negro, pero puede contener algún tipo de texto "esta parte del video ha sido ...") y lo mismo con el audio. El apagón y el silencio serían probablemente suficientes por ahora, pero necesito estar listo para más :-) Y es importante que el momento del video principal permanezca sin cambios ...
Radek Hladík

Respuestas:

4

Suponiendo que desea bloquear el video y silenciar el audio donde sea necesario, su plantilla de comando básica sería

ffmpeg -i video.mp4 -f lavfi -i "color=black:s=1280x720:r=25" -filter_complex \
"[0:v][1]overlay=enable='between(t,25,35)'[a]; \
 [a][1]overlay=enable='between(t,80,90)'[b]; \
 [b][1]overlay=enable='between(t,94,115)'[c]; \
 ...
 [n][1]overlay=enable='between(t,4805,4821)'[video]; \
 [0:a]volume=0:enable='between(t,25,35)', \
      volume=0:enable='between(t,80,90)', \
      volume=0:enable='between(t,94,115)', \
      ...
      volume=0:enable='between(t,4805,4821)'[audio]" \
-map "[video]" -map "[audio]"  output.mp4

El tamaño y la velocidad del color deben ser los mismos que los de su video.

Si desea reemplazar la pantalla negra con una imagen, elimine la -f lavfiexpresión de color y agregue -loop 1antes -i image.jpg.

Gyan
fuente
Acepté esto como respuesta. Para ser claros, con el video creas múltiples pasos ([a], [b], [c]) cada uno con un apagón, mientras que en el audio creas solo uno ([audio]) con todos los silencios.
Radek Hladík
Sí, ya que la superposición requiere dos entradas. Es mejor terminar la cadena de filtros y comenzar una nueva.
Gyan
Parece funcionar. Solo una pregunta. ¿Sería posible evitar volver a codificar las partes "intactas"? Entiendo que habría algunos márgenes alrededor de las partes bloqueadas debido a los fotogramas clave, pero me gustaría copiar el resto del archivo ...
Radek Hladík
Dependiendo de cuántos segmentos censurados haya, sería demasiado problema, tanto en la creación de archivos intermedios como para volver a unirlos. El método básico consistiría en usar segmento muxer en modo copia con -segment_timesvalores para dividir el video. Luego, realice la superposición en los segmentos requeridos y codifique con los mismos parámetros que el video original. Luego, use concat demuxer para unir segmentos intactos y codificados nuevamente. Lo mejor es volver a codificar todo el audio usando el método en mi respuesta.
Gyan
1
Agregue el más corto a las superposiciones de esta manera:[a][1]overlay=enable='between(t,80,90)':shortest=1[b];
Gyan