Наложение видео FFMpeg с задержкой звука и видео в фоновом видео

Наложение видео FFMpeg с задержкой звука и видео в фоновом видео

Я пытаюсь создать видимость картинки в картинке на видео, используя несколько видеофайлов.

Я создал файл .mp4 с помощью FFMpeg. Видео отображается правильно в приложении Windows "Фильмы и ТВ". Оно не отображается правильно в Chrome, Firefox, VLC Media Player или любом другом приложении, которое у меня есть. Я планирую отображать видео в браузере, поэтому для меня важна кроссбраузерная поддержка.

Видео было создано путем взятия двух частей видеозвонка и выполнения следующих действий с помощью FFMpeg:

  1. Включите удаленное видео (remote.mp4) в фоновом режиме.
  2. Удаленное видео должно показывать первое изображение видео и выглядеть приостановленным примерно до 2,501 секунды. Я сделал это с помощью itoffset.
  3. Удаленный звук также должен начать воспроизводиться через 2,501 секунды. Установка itoffset, похоже, не дала результата, поэтому я добавил опцию "adelay" в filter_complex.
  4. Размещено локальное видео (local.mp4) в качестве наложения в правом нижнем углу.
  5. Локальное видео и аудио должны начать воспроизводиться с 0 секунд (сразу после воспроизведения видео).
  6. Повернул фоновую картинку на 90 градусов (она была записана боком).
  7. Добавьте задержку звука к удаленному видео, чтобы воспроизведение аудиопотока началось через 2,501 секунды после начала.
  8. Объедините аудиовходы.
  9. Использовал кодек aac (так как он кажется популярным, я полностью готов перейти на него, если это будет полезно).
  10. Используйте видеокодек h264, опять же потому, что он кажется популярным.

Моя команда FFMpeg выглядит следующим образом:

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

Свойства видео:

  1. завершено.mp4 (16 секунд, 480x640)
  2. local.mp4 (16 секунд, 640x480)
  3. remote.mp4 (14 секунд, 640x480, повернуто вбок)

Когда я смотрю на готовое видео в браузере, вместо 16 секунд там написано 18 секунд. Когда я использую ffprobe на готовом видео, там написано: Продолжительность: 00:00:16.68. Локальное аудио и видео также ждут 2.501 секунды для воспроизведения в браузере.

Любая помощь будет замечательной. Я понятия не имею, почему браузер отображает это не так, как я предполагал. Спасибо!

решение1

С временными метками смещения ffmpeg будет делать это через списки редактирования в выходном MP4. Похоже, браузеры их не анализируют. Так что нам нужен обходной путь.

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

Сдвигает setptsвременные метки всех кадров, кроме первого. fpsЗатем фильтр заполняет этот пробел дубликатами первого кадра. Я предположил, что скорость входного потока составляет 30.

Связанный контент