FFMpeg 视频叠加,背景视频中带有延迟音频和视频

FFMpeg 视频叠加,背景视频中带有延迟音频和视频

我正在尝试使用多个视频文件在图片视频中创建图片的外观。

我使用 FFMpeg 创建了一个 .mp4 文件。视频在 Windows“电影和电视”应用中显示正确。但在 Chrome、Firefox、VLC Media Player 或我拥有的任何其他应用中均无法正确显示。我计划在浏览器中显示视频,因此跨浏览器支持对我来说很重要。

该视频是通过截取视频通话的两个部分并使用 FFMpeg 执行以下操作创建的:

  1. 将远程视频(remote.mp4)放在后台。
  2. 远程视频应显示视频的第一幅图像并暂停直至约 2.501 秒。我使用 itoffset 完成了此操作。
  3. 远程音频也应在 2.501 秒后开始播放。设置 itoffset 似乎无法实现这一点,因此我向 filter_complex 添加了“adelay”选项。
  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,横向)

当我在浏览器中查看完成的视频时,它显示 18 秒而不是 16 秒。当我对完成的视频使用 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。

相关内容