Estoy intentando superponer dos videos con diferentes horas de inicio y mezclar sus pistas de audio.
Estos archivos de entrada son grabaciones WebRTC y cada uno contiene una única pista de audio o vídeo.
Entradas:
RTc0.webm
: audio, Opus 40k, tiempo de inicio 9.078 seg.RT5f.webm
: audio, Opus 40k, tiempo de inicio 1.262 seg.RT8c.mkv
: vídeo, H.264, tiempo de inicio 9.078 seg.RTf7.mkv
: vídeo, H.264, tiempo de inicio 1.298 seg.
Quiero dibujar estos videos uno al lado del otro y mezclar su audio.
Primer intento, usando-copyts
Mi idea inicial fue utilizar-copyts
y simplemente permita que todo se alinee usando su código de tiempo común compartido.
Mi línea de comando se ve así:
ffmpeg \
-copyts \
-ss 224.1 -i RTc0.webm -t 60 \
-ss 224.1 -i RT5f.webm -t 60 \
-ss 224.1 -i RTf7.mkv -t 60 \
-ss 224.1 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a][0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
Al ejecutar esto, obtengo una salida donde el video es correcto (un video comienza en 0 segundos, el otro comienza 7 segundos después), pero ambas pistas de audio comienzan en 0 segundos. El comportamiento esperado es que una pista de audio comience en 0 segundos y la otra comience 7 segundos después, sincronizada con la segunda pista de video.
Segundo intento, usando -itsoffset
yasetpts
También intenté usar -itsoffset
para cambiar las pistas de video. Esto funcionó pero -itsoffset
no hizo nada con mis pistas de audio. Tenía efectos extraños, a veces ponerlo en uno los desplazaba a ambos en el tiempo.
ffmpeg \
-ss 0.00000000 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.816 -i RT5f.webm -t 60 \
-ss 0.00000000 -itsoffset 0 -i RTc0.webm -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[0:v] scale=640x480 [left];
[1:v] scale=640x480 [right];
[background][left] overlay=shortest=1 [background+left];
[background+left][right] overlay=shortest=1:x=640 [vout];
[2:a][3:a] amix=inputs=2:duration=longest [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
Luego intenté usar elasetpts
filtrarpara cambiar la pista de audio para preservar la alineación, pero no funcionó. El comando asetpts=PTS+(7.816/TB)
simplemente fue ignorado:
ffmpeg \
-copyts \
-ss 0 -i RTc0.webm -t 60 \
-ss 0 -i RT5f.webm -t 60 \
-ss 0 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a] asetpts=PTS+(7.816/TB), [0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska segment_0.mkv
¿Qué estoy haciendo mal?
Respuesta1
El filtro amix sincroniza todas las entradas para que comiencen al mismo tiempo. La solución es omitir -ss
las entradas de audio, aplicarlas aresample=async=1,atrim=225.398
a cada entrada de audio y luego mezclar esas transmisiones filtradas.
225.398
es 224.1+1.298
: su ss
valor + hora de inicio de la transmisión de video de inicio anterior. He usado el valor de la transmisión de video ya que el audio correspondiente comienza antes, por lo que puedes perder la sincronización si usas su valor.