Superposición de vídeo FFMpeg con audio retrasado y vídeo en segundo plano

Superposición de vídeo FFMpeg con audio retrasado y vídeo en segundo plano

Estoy intentando crear la apariencia de una imagen en un video usando varios archivos de video.

Creé un archivo .mp4 usando FFMpeg. El video se muestra correctamente en la aplicación "Películas y TV" de Windows. No se muestra correctamente en Chrome, Firefox, VLC Media Player ni en ninguna otra aplicación que tenga. Planeo mostrar el video en un navegador, por lo que la compatibilidad con varios navegadores es importante para mí.

El vídeo se creó tomando dos partes de una videollamada y haciendo lo siguiente con FFMpeg:

  1. Ponga el vídeo remoto (remote.mp4) en segundo plano.
  2. El vídeo remoto debería mostrar la primera imagen del vídeo y aparecer pausado hasta unos 2.501 segundos. He hecho esto usando itoffset.
  3. El audio remoto también debería comenzar a reproducirse después de 2.501 segundos. Configurar itoffset no pareció lograr esto, así que agregué una opción "adelay" al filter_complex.
  4. Se colocó video local (local.mp4) como una superposición en la esquina inferior derecha.
  5. El video y el audio locales deberían comenzar a reproducirse a los 0 segundos (inmediatamente después de reproducir el video).
  6. Giró la imagen de fondo 90 grados (se grabó de lado).
  7. Agregue un retraso de audio al video remoto para que comience a reproducir la transmisión de audio 2.501 segundos después del inicio.
  8. Fusiona las entradas de audio.
  9. Códec aac usado (porque parece popular, estoy totalmente dispuesto a cambiarlo si eso fuera útil).
  10. Utilice el códec de vídeo h264, nuevamente porque parece popular.

Mi comando FFMpeg es el siguiente:

ffmpeg -itsoffset 2.501 -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501[0adelay]; \
     [0adelay]apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

Propiedades del vídeo:

  1. completado.mp4 (16 segundos, 480x640)
  2. local.mp4 (16 segundos, 640x480)
  3. remoto.mp4 (14 segundos, 640x480, volteado de lado)

Cuando miro el vídeo completo en un navegador, en lugar de ser 16 segundos dice 18 segundos. Cuando uso ffprobe en el video completo, dice: Duración: 00:00:16.68. El audio y vídeo local también espera 2.501 segundos para reproducirse en un navegador.

Cualquier ayuda sería maravillosa. No tengo idea de por qué el navegador lo muestra de manera diferente a lo que pretendía. ¡Gracias!

Respuesta1

Con las compensaciones de marca de tiempo, ffmpeg lo efectuará a través de listas de edición en el MP4 de salida. Parece que los navegadores no los analizan. Entonces, necesitamos una solución.

ffmpeg -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1,setpts='if(eq(N,0),PTS,PTS+2.501/TB)',fps=30[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501,apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

Las setptsmarcas de tiempo de los cambios de todos los fotogramas excepto el primero. Luego, el fpsfiltro llena ese espacio con duplicados del primer fotograma. He asumido una velocidad de flujo de entrada de 30.

información relacionada