音视频

裸眼 3D 视频转换

把普通的 2D 视频转成左右并排(SBS)立体对,不戴任何眼镜,靠交叉法(俗称斗鸡眼)或者放松双眼就能看出景深。深度模型逐帧读出画面里的远近关系,再据此合成出另一只眼睛看到的那一路画面。全程在浏览器标签页里跑,文件不上传。

  • 逐帧估计深度再合成第二视角,普通 2D 素材就行、不必是双机位拍的;效果取决于镜头内容
  • 正式转换前可以先渲染单帧预览,并且能直接看到模型算出来的深度图

把视频拖到这里

文件留在你自己机器上,不会上传

支持 MP4、MOV、MKV、WebM、AVI、WMV、FLV、MPEG-TS、MPG、3GP,以及 FFmpeg 能识别的绝大多数格式。

先添加一个视频普通的 2D 视频就行。深度是从画面本身算出来的,不需要特殊相机。

3D

功能简介

这个工具拿平面视频做了些什么,以及每一步为什么存在。

  1. 01

    从单个视角推出深度

    神经网络深度模型逐帧估计每个像素的相对远近——不是测量真实距离,而是判断谁在谁前面。用的线索和人看照片时判断远近是同一套:遮挡关系、透视、纹理疏密、相对大小。正因为如此,普通素材就能用,而不是只能用双机位拍的片子。

  2. 02

    合成出来的第二只眼

    深度图驱动横向位移:近处像素移得多、远处移得少,这正是现实中两只眼睛收到的画面之间的差异。左右两路各承担一半位移,而不是固定一只眼、另一只移全量,这样构图保持居中,每一路撕开的遮挡区域也只有一半大。

  3. 03

    用背景来补空洞

    像素横向移动会露出相机从没拍到的区域,位置总是在近处物体的边缘。每处空洞都从更远的那一侧取像素来补,因为缺失的内容本来就属于背景。反过来从近处一侧补,就是廉价转换里前景物体周围那圈橡皮膜一样拖影的来源。

  4. 04

    让深度在时间上稳住

    深度模型跑单帧时并不知道上一帧长什么样,所以哪怕镜头完全不动,输出也会抖。到了立体画面里,这种抖动看起来就是物体在深度上一呼一吸,是转换后的视频最让人难受的地方。深度图本身和它归一化所用的区间,都做了跨帧平滑。

  5. 05

    平行法和交叉法都能出

    同一对图像两种看法都能用,区别只在左右两半的顺序。交叉法多大的画面都能看,平行法受瞳距限制,但一旦看进去会更舒服。

  6. 06

    开跑之前先看一帧

    景深强度和屏幕平面放在哪,都是要看具体镜头的感知类参数。单帧几秒钟就能跑完整条链路,连深度图一起给你看,这样调参数是对着画面调,而不是对着滑块的位置调。

  7. 07

    分段处理

    整段视频是切成小段依次处理的,每一段抽帧、转换、编码完就立刻丢掉再进下一段。因此峰值内存取决于单帧多大,而不是视频多长——这也正是浏览器标签页里能转完整片子的原因。

  8. 08

    带走第一条音轨

    第一条音轨在最后一步一次性合回成品,而不是跟着每一段切来切去。容器能原样承载时直接复制不重编码,不能承载才转成 AAC。其余音轨和字幕不会保留。

如何使用

从一段平面视频到能看出立体的成品。

  1. 01

    添加视频。任意普通 2D 素材都行——手机拍的、录屏的、下载的。文件不会离开你的浏览器。

  2. 02

    选平行法还是交叉法。如果你从来没试过自由融合,先从交叉法开始:多数人觉得更容易,而且画面多大都能看。

  3. 03

    设置单眼尺寸。越小越容易融合,转换也越快。640px 在手机屏幕上很合适。

  4. 04

    在预览里渲染一帧看看,调整 3D 强度,直到景深清晰但物体边缘还没开始拉丝。

  5. 05

    把预览切到深度图。亮的近、暗的远。如果模型看错了场景,这里比看立体图像对更容易发现。

  6. 06

    核对一下执行计划:输出尺寸、分几段、多少帧、峰值内存需要多少。

  7. 07

    点开始转换。进度按段汇报,剩余时间是根据实测速度算的,不是猜的。转换期间让标签页留在前台。

  8. 08

    直接播放结果,或者下载下来在手机上看——手机是平行法最容易成功的屏幕。

功能说明

决定成品你到底能不能看出立体的那些细节。

  • 逐帧单目深度估计,浏览器和 FFmpeg 能解码的大多数 2D 素材都可以用
  • 左右两路各承担一半位移,把任一路露出的遮挡区域减半
  • 按深度排序写入像素,两个像素落到同一位置时近的赢
  • 空洞从边缘较远的一侧填补,避开廉价转换典型的前景拖影
  • 深度图和它的归一化区间都做跨帧平滑,画面里有东西进出时整个场景不会突然一跳
  • 转换时选择平行法或交叉法排列,并附带各自的观看方法说明
  • 单帧预览同时给出立体图像对和模型算出的深度图
  • 景深强度、屏幕平面、深度曲线均可调,且都能先预览
  • 帧率上限,60fps 的手机素材不必付出双倍代价
  • 分段转换,工作内存由单帧大小决定而不随片长增长
  • 开跑前显示峰值内存,帧太大到根本处理不了时明确拦下
  • 剩余时间由实测吞吐算出而非预估,因为 GPU 和 CPU 路径相差一个数量级
  • 第一条音轨一次性合入,容器允许时直接复制,分段边界不引入漂移
  • 输出是随处可播的普通 MP4——立体信息在画面里,不依赖特殊格式
  • 全程在浏览器标签页内运行:不上传、不排队、不注册、无水印

适合哪些场景

大家为什么想把平面视频转成立体图像对。

  1. 让老素材有景深

    家庭录像、存档片段,以及所有在立体拍摄普及之前拍的东西,都只有平面版本。对于永远补拍不了的素材,深度估计是拿到第二视角的唯一途径,而自由融合意味着看结果连硬件都不用买。

  2. 不花钱先试试立体

    头显或 3D 显示器是笔实打实的开销,只凭一个念头就买有点冒险。左右并排(SBS)图像对用自己的眼睛就能看,成本为零,而且是用你自己的素材来回答"这个效果对我值不值",不是看厂商的演示片。

  3. 给 VR 头显准备素材

    左右并排(SBS)是绝大多数头显视频播放器认识的排布。但文件里没有写入立体格式元数据,所以多数播放器需要你手动选「左右格式」和左右眼顺序,选好之后景深才会出来——同一个能在手机上自由融合的文件在那边一样能用。

  4. 航拍和风景镜头

    航拍和大景别风景有非常明确的深度层次——前景山脊、中景谷地、远处地平线——正是深度模型判断最可靠的那类场景。这类素材的转换效果比几乎所有其他题材都好。

  5. 产品和实物视频

    单个物体在干净背景前旋转,接近理想情况:主体明确、边缘干净、背景简单,所以物体后面裂开空洞时,需要凭空补的内容也少。

  6. 讲解立体视觉

    能把一段片子转出来、再把深度图并排放在旁边看,这种方式让原理变得可见,是图示做不到的。失败的例子和成功的例子一样有教学价值。

  7. 不能外传的素材

    家庭录像、客户的活儿,以及任何签了协议的内容,都没有理由为了做个实验就上传到别人的服务器。这里的一切都发生在标签页内,打开网络面板就能看到什么都没出去。

延伸阅读

每一帧不管留不留都要付一次深度估计,所以把长录像先剪成你真正想要的那一段再转很值得,这件事该交给 视频截取。这里的单眼尺寸是按自由融合的需要设的、不是按画质设的,所以如果你需要先把源视频本身改成别的尺寸,请用 视频尺寸调整与裁剪。另外成品固定写成 MP4,之后想转成别的格式则是 视频格式转换的活。

自由融合到底是怎么回事

裸眼立体背后的原理,以及决定你能不能看见的那一条限制。

  1. 两幅画面,一只眼睛一幅

    所有立体 3D 的原理都一样:让两只眼睛各看到同一场景略有差别的一幅画面,大脑就会把它们融合成景深。影院靠偏振眼镜把两幅画面分开,头显靠两块屏幕。自由融合则是跳过硬件,靠你自己控制眼球朝向,让每只眼睛正好落在左右并排(SBS)画面的其中一半上。

  2. 平行法和交叉法的区别

    这是两种瞄准方式。平行法是双眼向外放松、像是望向屏幕后方,左眼画面应该放在左边。交叉法是双眼向内、聚焦在屏幕前方,所以两半要对调。同一个文件没法两种通吃——用错方式看,景深会反转,画面整个里外翻过来。

  3. 为什么平行法对尺寸这么敏感

    要融合平行法图像对,双眼向外转的角度不能超过正前方,因为人眼没法发散。这就给对应点之间的间距划了一条硬上限:大约 63 毫米,也就是瞳距。手机上轻而易举;27 寸显示器上满屏播放时,每半张画面差不多 30 厘米宽,根本融不了。

  4. 交叉视差与非交叉视差

    当一个点位于屏幕前方时,两条视线会在到达它之前交叉,左眼看到它偏右——这就是交叉视差。位于屏幕后方时则相反,而且间距受上面那条发散极限的约束。这也是为什么屏幕平面默认放在场景最远端:这样所有东西都朝你凸出,永远不会超出眼睛做得到的范围。

  5. 瑕疵是从哪来的

    任何基于深度的转换都受两件事限制。一是模型会看错场景——墙上的海报被当成窗户、倒影被当成纵深——这种情况调什么参数都救不回来,所以深度图值得看一眼。二是像素横移会露出从没拍到的背景,只能凭空补出来。强度越高这两样越明显,所以保守的参数往往反而更好看。

  6. 这个工具不是什么

    它不是户外弧形 LED 大屏上那种透视错觉——那是针对特定屏幕几何做的,从平面视频里推不出来。它不是全息,也不是光场。它更不能替代真正用双机位拍摄的素材,那种片子的第二视角是真拍出来的,而不是推断出来的。

使用建议

让成品好看而不是看得头疼的几个习惯。

  • 转换前先预览一帧,而且取片子中间的帧而不是第一帧——开头常常是淡入或者标题
  • 从 2% 左右的强度起步,只加到景深清楚为止,瑕疵增长得比效果快
  • 成品不理想时先看深度图,因为场景看错了是任何滑块都救不回来的,而且会立刻告诉你该换素材
  • 没有特别理由就把屏幕平面留在最远端,这样所有物体都在屏幕前方、都在眼睛能融合的范围内
  • 要用平行法看就选小的单眼尺寸并且在手机上看,手机是唯一能轻松满足宽度限制的屏幕
  • 第一次接触自由融合先试交叉法,能稳定融合之后再换平行法
  • 优先选前景清楚、背景真实的片段——平坦场景、大特写、严重运动模糊都会让模型无从下手
  • 长录像先剪成你要的那一段再转,因为每一帧不管留不留都要付一次深度估计
  • 转换期间让标签页留在前台,浏览器会限制后台标签页,长片会被拖得很久
  • 60fps 拍的手机素材把帧率上限设成 30,这一半的工作量换来的运动细节,在自由融合的画面里根本分辨不出来

边界与注意事项

这个工具做不到什么,以及哪些情况下结果会让你失望。

  • 第二视角是推断出来的,不是拍出来的。深度只从单张画面估计,估错的地方几何就跟着错——这和双机位实拍的素材不是一回事。
  • 模型会看错一些场景。倒影、玻璃、画面里印着的照片、纹理很强的平面、严重的运动模糊,判断都不可靠。深度图预览的意义就在于让你看见,而不是靠猜。
  • 物体背后被遮住的区域只能凭空补出来。没有任何镜头拍过它,所以补的是相邻背景的拉伸。强度适中时不显眼,强度高了就很明显,尤其在细长物体和头发周围。
  • 这不是户外弧形 LED 大屏那种透视错觉。那种效果是针对特定屏幕几何和特定观看位置构造出来的,从平面视频里推不出来,不管某些应用怎么宣传。
  • 自由融合是一项需要练的技能。相当一部分人一开始看不出来,也有人始终觉得不舒服。交叉法对多数人更容易;头显则完全绕开这个问题。
  • 平行法受画面在屏幕上的物理宽度限制,而不是像素尺寸。在手机上能融合的图像对,在显示器上满屏播放可能完全看不了——这一点工具里任何参数都改变不了,只能靠你把它显示得小一些。
  • 时间平滑能减轻抖动但消不掉。快速运动、片段内部的剪辑点、光线剧烈变化,深度上仍然会有一些不稳定。
  • 源视频内部的剪辑点会被当作连续运动处理,因为分段是按时间切的、不是按镜头切的。深度会在剪辑点上短暂地混合过去。
  • 画面一定会被重新编码。和这里的剪辑、音频工具不同,这个工具每个像素都变了,所以没有流复制的路径,一次编码损失无法避免。
  • 输出画面宽度是源视频的两倍,文件也相应更大。
  • 首次使用要下载约 31MB 的引擎,加上 26 到 47MB 的深度模型。之后都走缓存,但全新的浏览器配置要把两样都下一遍。
  • 没有 WebGPU 时深度模型会退回 CPU,大约慢十倍,这会让长片在 Safari 和旧浏览器上变得不现实。
  • GPU 上转换速度大致是实时,所以十分钟的视频差不多要十分钟,期间标签页要开着并留在前台。没有队列,也没有后台处理。
  • 一段之内的帧要驻留内存,而 WebAssembly 是 32 位的。帧太大的情况会被直接拦下而不是跑到一半失败,但源文件很大在手机上依然有风险。

常见问题

把平面视频转立体时常见的问题。

怎么把 2D 视频转成 3D?

添加视频,选平行法还是交叉法,设好单眼尺寸,点开始转换。深度模型会逐帧读出画面里什么近什么远,再按深度比例把像素横向错开,合成出第二个视角。成品是一个普通 MP4,里面并排放着两幅画面,一只眼睛一幅。建议先预览一帧:景深强度是要看具体镜头的判断题,在静帧上确认只要几秒,跑完整段则要几分钟。

看这个结果需要 3D 眼镜吗?

不需要,这正是重点。成品是左右并排(SBS)图像对,靠调整眼球朝向来看,而不是靠镜片过滤。轻微对眼,或者放松双眼像望向屏幕后方,直到两半画面重叠出中间的第三幅画面——中间那幅是有景深的。这是个窍门而不是魔术,大多数人几分钟内就能掌握。如果实在不想学,同一个文件丢进 VR 头显也能直接播。

平行法和交叉法有什么区别?

这是两种瞄准眼睛的方式,各自要求两半画面按不同顺序排列。平行法是双眼向外放松、像看穿屏幕,需要左眼画面在左边。交叉法是双眼向内、聚焦屏幕前方,所以两半要对调。用错方式看会让景深反转:前景凹进去、背景浮起来,看着不对劲但又说不上哪里不对,所以要在转换之前就选好。

为什么我在显示器上看不出立体效果?

几乎可以肯定是画面太大了,平行法几乎人人都栽在这上面。要融合平行法图像对,双眼向外转的角度不能超过正前方,因为人眼没法发散——这就把对应点之间的间距卡在大约 63 毫米,也就是瞳距。27 寸显示器上满屏播放时每半张画面差不多 30 厘米宽,根本融不了。把窗口缩小、人往后坐,或者干脆在手机上看。交叉法没有这条限制,画面多大都行。

我的视频会被上传吗?

不会。视频引擎是编译成 WebAssembly 的 FFmpeg,深度模型跑在 WebGPU 或 WebAssembly 上,两者都在你的浏览器标签页里。文件从磁盘读进标签页内存,成品再写回成下载文件。整个过程只有引擎和模型本身会从网络取一次,其余什么都不动——转换时打开网络面板就能确认。

转换要多久?

取决于设备、输出尺寸、帧率和素材本身,没有一个值得引用的固定数字。每一帧都要算深度,这一步的开销压倒其他所有环节,所以有 WebGPU 的机器比没有的快得多——CPU 兜底跑短片段还能接受,长片就不现实了。进度条不做预估,而是按实测吞吐给剩余时间,开跑几秒后就会准起来。

视频长度有上限吗?

没有固定的时长阈值,但确实存在上限。整段视频是切成小段处理的,每一段抽帧、转换、编码完就交出引擎内存再进下一段,所以处理本身不随时长增长。增长的是成品:它必须在内存里完整拼装一次才能保存,因为引擎没有别的地方可写。能撑多长取决于输出尺寸、帧率、素材好不好压,以及设备可用内存。工具会在开跑前算清楚你这套设置装不装得下并直接告知,而不是跑到一半失败;想要更长,就选更短的区间或更小的单眼尺寸。

为什么有些视频转出来立体感是错的?

通常是深度模型看错了场景,深度图预览会把这一点直接摆给你看。倒影、玻璃、纹理很强的平面、画面里印着的照片、严重的运动模糊,判断都不可靠,而深度图错了之后再怎么调强度都补不回来。前景清楚、背景真实的场景——风景、航拍、房间里的人物——转换效果比平坦或者杂乱的场景好得多。

物体边缘那圈拉丝是什么?

把像素横移出第二只眼时,会露出原先被近处物体挡住的区域,而从来没有镜头拍过那里,只能凭空补。每处空洞都是从边缘的背景一侧取内容来补的,那确实是缺失内容本来该属于的地方,但补出来的终究是补出来的。它随景深强度增长,这也是为什么保守的参数通常比强参数好看。细长物体和头发是最难的情况。

能做出户外大屏那种裸眼 3D 吗?

做不到,而且从平面视频出发谁都做不到。那种大屏的原理是:针对某一块特定的弧形屏幕、以及某一个特定的观看位置,把场景按所需的透视畸变渲染出来——错觉存在于屏幕的几何形状和你站的位置之间。这些信息在普通视频里根本不存在,也就无从还原。这个工具做的是立体图像对,是另一种效果、另一套机制。

手机竖拍的视频能用吗?

能。竖版素材会保持原方向,文件里记录的旋转信息也会被正确处理——竖着拍的片子会被当成竖版,而不是报成一个横躺的画面。成品是两幅竖版画面并排,整体挺宽,但恰恰因为每一半都很窄,自由融合的效果反而很好。

声音会怎么处理?

第一条音轨会在最后一步一次性合进成品,而不是跟着每一段切开再拼回去——在每个分段边界切音频正是漂移的来源。输出容器能原样承载这条流时直接复制、不重新编码;不能承载才转成 AAC。只有第一条音轨会保留,其余语言轨和字幕不会带过来。由于转换不改动任何时间信息,声音仍然对在原来的位置上;源视频没有声音时也会正常处理。

更多相关工具

更多在浏览器本地处理视频的工具。