Я пытаюсь создать видимость картинки в картинке на видео, используя несколько видеофайлов.
Я создал файл .mp4 с помощью FFMpeg. Видео отображается правильно в приложении Windows "Фильмы и ТВ". Оно не отображается правильно в Chrome, Firefox, VLC Media Player или любом другом приложении, которое у меня есть. Я планирую отображать видео в браузере, поэтому для меня важна кроссбраузерная поддержка.
Видео было создано путем взятия двух частей видеозвонка и выполнения следующих действий с помощью FFMpeg:
- Включите удаленное видео (remote.mp4) в фоновом режиме.
- Удаленное видео должно показывать первое изображение видео и выглядеть приостановленным примерно до 2,501 секунды. Я сделал это с помощью itoffset.
- Удаленный звук также должен начать воспроизводиться через 2,501 секунды. Установка itoffset, похоже, не дала результата, поэтому я добавил опцию "adelay" в filter_complex.
- Размещено локальное видео (local.mp4) в качестве наложения в правом нижнем углу.
- Локальное видео и аудио должны начать воспроизводиться с 0 секунд (сразу после воспроизведения видео).
- Повернул фоновую картинку на 90 градусов (она была записана боком).
- Добавьте задержку звука к удаленному видео, чтобы воспроизведение аудиопотока началось через 2,501 секунды после начала.
- Объедините аудиовходы.
- Использовал кодек aac (так как он кажется популярным, я полностью готов перейти на него, если это будет полезно).
- Используйте видеокодек 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
Свойства видео:
- завершено.mp4 (16 секунд, 480x640)
- local.mp4 (16 секунд, 640x480)
- 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.