如何 "merge" 2 VR180 视频文件使用 ffmpeg 获得 360 视频 (2xVR180) 输出?
How to "merge" 2 VR180 video files to get a 360 video (2xVR180) output with ffmpeg?
我想知道如何实际使用 ffmpeg 从 2 个不同的 VR180 视频创建一个 2xVR180 视频文件。
也就是说,正面是立体3D视频,背面是立体3D视频。
视频是用 Insta360 EVO 在 3D 模式下拍摄的,所以我可以处理 4 个视频文件(2 个 INSV 文件用于左眼,其他 2 个 INSV 文件用于右眼),o 直接用 2 个拼接HEVC/MP4 个文件。
我知道结果不会是 360 度 3D 立体视频,这就是我说“2xVR180”的原因。
感谢您的帮助
终于找到解决方法了!
“算法”是:
- 将两个视频文件的左眼和右眼分开
- 加入左眼
- 加入右眼
- 左眼与右眼连接
- 调整视频大小
结果类似于:
Front left eye | Back left eye | Front right eye | Back right eye
为了使用 ffmpeg 获得它,我使用了以下语法
ffmpeg -i front_vr180.mp4 -i back_vr180.mp4 -filter_complex "[0:v]crop=2880:2880:0:0[aleft];[0:v]crop=2880:2880:iw-2880:0[aright];[1:v]crop=2880:2880:0:0[bleft];[1:v]crop=2880:2880:iw-2880:0[bright];[aleft][bleft]hstack=inputs=2[left];[aright][bright]hstack=inputs=2[right];[left][right]hstack=inputs=2[full];[full]scale=7680:-1[v]" -map "[v]" -b:v 200M -preset slow -crf 6 full_360VR_test.mp4
我将 crop 过滤器(眼睛分离)与 hstack 过滤器(视频串联)链接起来,最终通过缩放过滤器调整视频大小。
更多详情:
- -i front_vr180.mp4 : 眼前要看的VR180视频文件
- -i back_vr180.mp4 : 后面想看的VR180视频文件
- -filter_complex:我必须应用一系列过滤器才能使其正常工作
- [0:v]crop=2880:2880:0:0[aleft]:
- [0:v] 表示“第一个输入,视频通道”,放在过滤器之前意味着这是该过滤器的输入
- crop=2880:2880:0:0[aleft] 表示输入将被裁剪为从 (0,0)(左上角)开始的 2880x2880 尺寸。换句话说,第一个视频(视频 A 或前面)的左方块。 [aleft]只是一个标签,用于标识此过滤器的结果(视频A的左侧部分)
- 获取 A 视频的右侧部分(右)以及 B 视频的左侧和右侧部分也是如此
- [aleft][bleft]hstack=inputs=2[left] 这意味着我会将两个左眼视频并排连接成一个独特的 [left] 视频。如果 aleft 和 bleft 是 2880x2880 视频,[left] 将是 5760x2880 视频。
- 用右眼看 [正确] 5760x2880 视频也是一样。
- [left][right]hstack=inputs=2[full] : 和之前一样的逻辑,[left]和[right]并排拼成[full],实现3D SBS效果.
此时,我们会有一个 2xVR180 视频,但尺寸太大 (11520x2880),需要缩小(例如 8K)。这是通过 [full]scale=7680:-1[v] 完成的。 7680 是宽度,-1 作为高度意味着我们让 ffmpeg 确定正确的高度以保持纵横比。缩小后的结果 [v] 将为 7680x1920。
- -map "[v]" : 表示只需要视频通道
- -b:v 200M :此选项设置比特率。值取决于输入的视频文件......更多的比特率意味着更多的细节,但如果输入的比特率较低,ffmpeg 将不会发明细节。我选择了 bitrate = sum(input bitrates).
- crf 6 : CRF 表示恒定速率因子。 0 = 无损,51 = 质量最差,使用 x264。
- preset slow: 好吧,我认为 ffmepg 文档会比我更好地解释这一点。更慢,质量更好:)
我想知道如何实际使用 ffmpeg 从 2 个不同的 VR180 视频创建一个 2xVR180 视频文件。 也就是说,正面是立体3D视频,背面是立体3D视频。
视频是用 Insta360 EVO 在 3D 模式下拍摄的,所以我可以处理 4 个视频文件(2 个 INSV 文件用于左眼,其他 2 个 INSV 文件用于右眼),o 直接用 2 个拼接HEVC/MP4 个文件。
我知道结果不会是 360 度 3D 立体视频,这就是我说“2xVR180”的原因。
感谢您的帮助
终于找到解决方法了!
“算法”是:
- 将两个视频文件的左眼和右眼分开
- 加入左眼
- 加入右眼
- 左眼与右眼连接
- 调整视频大小
结果类似于:
Front left eye | Back left eye | Front right eye | Back right eye
为了使用 ffmpeg 获得它,我使用了以下语法
ffmpeg -i front_vr180.mp4 -i back_vr180.mp4 -filter_complex "[0:v]crop=2880:2880:0:0[aleft];[0:v]crop=2880:2880:iw-2880:0[aright];[1:v]crop=2880:2880:0:0[bleft];[1:v]crop=2880:2880:iw-2880:0[bright];[aleft][bleft]hstack=inputs=2[left];[aright][bright]hstack=inputs=2[right];[left][right]hstack=inputs=2[full];[full]scale=7680:-1[v]" -map "[v]" -b:v 200M -preset slow -crf 6 full_360VR_test.mp4
我将 crop 过滤器(眼睛分离)与 hstack 过滤器(视频串联)链接起来,最终通过缩放过滤器调整视频大小。
更多详情:
- -i front_vr180.mp4 : 眼前要看的VR180视频文件
- -i back_vr180.mp4 : 后面想看的VR180视频文件
- -filter_complex:我必须应用一系列过滤器才能使其正常工作
- [0:v]crop=2880:2880:0:0[aleft]:
- [0:v] 表示“第一个输入,视频通道”,放在过滤器之前意味着这是该过滤器的输入
- crop=2880:2880:0:0[aleft] 表示输入将被裁剪为从 (0,0)(左上角)开始的 2880x2880 尺寸。换句话说,第一个视频(视频 A 或前面)的左方块。 [aleft]只是一个标签,用于标识此过滤器的结果(视频A的左侧部分)
- 获取 A 视频的右侧部分(右)以及 B 视频的左侧和右侧部分也是如此
- [aleft][bleft]hstack=inputs=2[left] 这意味着我会将两个左眼视频并排连接成一个独特的 [left] 视频。如果 aleft 和 bleft 是 2880x2880 视频,[left] 将是 5760x2880 视频。
- 用右眼看 [正确] 5760x2880 视频也是一样。
- [left][right]hstack=inputs=2[full] : 和之前一样的逻辑,[left]和[right]并排拼成[full],实现3D SBS效果.
此时,我们会有一个 2xVR180 视频,但尺寸太大 (11520x2880),需要缩小(例如 8K)。这是通过 [full]scale=7680:-1[v] 完成的。 7680 是宽度,-1 作为高度意味着我们让 ffmpeg 确定正确的高度以保持纵横比。缩小后的结果 [v] 将为 7680x1920。
- -map "[v]" : 表示只需要视频通道
- -b:v 200M :此选项设置比特率。值取决于输入的视频文件......更多的比特率意味着更多的细节,但如果输入的比特率较低,ffmpeg 将不会发明细节。我选择了 bitrate = sum(input bitrates).
- crf 6 : CRF 表示恒定速率因子。 0 = 无损,51 = 质量最差,使用 x264。
- preset slow: 好吧,我认为 ffmepg 文档会比我更好地解释这一点。更慢,质量更好:)