VapourSynth 101 – Parte 3: Unir videos

VapourSynth 101 – Parte 3: Unir videos

Una duda recurrente que me presentan es la de unir videos o pedazos de videos. Para empezar, en VapourSynth sí es posible unir videos, solo se necesita que tengan:

  • La misma resolución
  • El mismo bitdepth y colorspace

Como se habrán dado cuenta, a VapourSynth no le interesa si los videos son de diferente framerate, y para x264 este parámetro es lo de menos. Sin embargo, si vamos a usar x265 (Yuuki, Asuna o Vanilla), esto se puede corregir de manera sencilla, colocando en nuestro script un AssumeFPS:

video = core.std.AssumeFPS(video,24000,1001) # Para 23.976, para 29.970 usar 30000,1001

Pero de ese tema hablaré otro día. Por ahora lo que nos concierne es unir videos, y eso es lo que vamos a hacer ahora.

Teniendo los dos videos que cumplan los requisitos anteriores, los llamaremos uno por nodo. A uno de los videos lo llamaremos “video1”, y al otro “video2”:

video1 = core.ffms2.Source(r"C:\Users\Gargadon\Videos\[USP RAWS] Duel Masters 2017 - 18 [E847EAE1].mkv")
video2 = core.ffms2.Source(r"C:\Users\Gargadon\Videos\[USP RAWS] Duel Masters 2017 - 50 [D9E30BA8].mkv")

Solo necesitamos el operador + para unir ambos videos en un nuevo nodo.

final = video1 + video2
final.set_output()

Al apretar F5 veremos que ambos videos están en uno solo (fíjense en la duración).

Ahora bien, es probable que queramos montar una sección de un video sobre otro video. Para eso utilizaremos la función Trim.

Supongamos el ejemplo de que queremos montar un opening de un episodio sobre otro (ya sea porque lo queremos creditless, porque la grabación falló o por cualquier otro motivo).

Las partes que queremos conservar del video “original” (video1) son las siguientes:

  • El previo al opening (Frames 0 a 3403)
  • El resto del video (Frames 5563 a 37102, o de los frames 5563 en adelante)

El opening que queremos montar entre el previo al opening y el resto del episodio (video2) se encuentra de los frames 4771 al 6928.

Podemos tumbar casi todas las líneas de código de nuestro vpy excepto las líneas iniciales, la importación de videos y la previsualización.

final = core.std.Trim(video1,0,3403) + core.std.Trim(video2,4771,6928) + core.std.Trim(video1,5563,37102)

Si todo ha salido bien hasta ahora, el frame 3404 de nuestro final no será el del video original, sino del video que hemos montado sobre.

Frame 3403
Frame 3404, fíjese que el nuevo opening contiene reloj y el logotipo de otro canal de emisión, por lo que se asume que no queda rastro del video original.

Así de fácil hemos creado un nuevo video que ya podemos exportar a x264, aplicando los filtros que consideren necesarios.

En caso de que no hayan comprendido del todo, el vpy debe quedar más o menos de esta forma:

import vapoursynth as vs
core = vs.get_core()

video1 = core.ffms2.Source(r"C:\Users\Gargadon\Videos\[USP RAWS] Duel Masters 2017 - 18 [E847EAE1].mkv")
video2 = core.ffms2.Source(r"C:\Users\Gargadon\Videos\[USP RAWS] Duel Masters 2017 - 50 [D9E30BA8].mkv")
final = core.std.Trim(video1,0,3403) + core.std.Trim(video2,4771,6928) + core.std.Trim(video1,5563,37102)
final.set_output()

Olvidé mencionar que, a diferencia de AviSynth, VapourSynth no acepta el parámetro 0 como valor final para Trim, pero podemos lograr el mismo efecto ignorando añadir el valor final. La penúltima línea de nuestro vpy puede ser reescrita de la siguiente forma:

final = core.std.Trim(video1,0,3403) + core.std.Trim(video2,4771,6928) + core.std.Trim(video1,5563)

Gargadon

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: