FFMpeg відео накладання з затримкою аудіо та відео у фоновому відео


2

Я намагаюся створити вигляд зображення у відеозображенні за допомогою декількох відеофайлів.

Я створив файл .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. complete.mp4 (16 секунд, 480x640)
  2. local.mp4 (16 секунд, 640x480)
  3. remote.mp4 (14 секунд, 640x480, повернуто боком)

Коли я дивлюся на завершене відео в браузері, а не на 16 секунд, це говорить про 18 секунд. Коли я використовую ffprobe на завершеному відео, він каже: Тривалість: 00: 00: 16.68. Локальні аудіо та відео також чекають 2,501 секунди для відтворення в браузері.

Будь-яка допомога буде чудовою. Я не маю уявлення, чому браузер робить його іншим, ніж я маю намір. Дякую!

Відповіді:


2

З зміщеннями тимчасової мітки, 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

The setpts зміщує часові мітки всіх кадрів, крім першого. The fps фільтр потім заповнює цей проміжок дублікатами першого кадру. Я припустив, що вхідний потік 30.


Вибачте, n має бути N
Gyan

Це чудово працює! Спасибі купу. Це повністю пояснює і вирішує проблему!
Daryl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.