我正在尝试使用多个视频文件在图片视频中创建图片的外观。
我使用 FFMpeg 创建了一个 .mp4 文件。视频在 Windows“电影和电视”应用中显示正确。但在 Chrome、Firefox、VLC Media Player 或我拥有的任何其他应用中均无法正确显示。我计划在浏览器中显示视频,因此跨浏览器支持对我来说很重要。
该视频是通过截取视频通话的两个部分并使用 FFMpeg 执行以下操作创建的:
- 将远程视频(remote.mp4)放在后台。
- 远程视频应显示视频的第一幅图像并暂停直至约 2.501 秒。我使用 itoffset 完成了此操作。
- 远程音频也应在 2.501 秒后开始播放。设置 itoffset 似乎无法实现这一点,因此我向 filter_complex 添加了“adelay”选项。
- 将本地视频(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,横向)
当我在浏览器中查看完成的视频时,它显示 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。