UNIT 15整条管线约 31 分钟
修片台(二):动起来、放出来才露馅的毛病
这一课的四张卡,停在任何一帧上都看不出毛病:要么藏在两帧之间(剪切点那一帧的重影),要么在镜头动起来时才露出来(推近时一闪、人走远以后凭空消失),要么在片子放到最后几秒(配乐结束以后多出来的一句)。查它们,得把时间也算进去。上一课的功夫在「定到哪一环」;这一课多一样:一个毛病常常不止一个原因,修掉一个,症状只轻了一截。所以先讲叠在一起的原因怎么拆,再上卡。每张卡的顺序和上一课一样:① 先定位,② 再找原因,③ 能造的亲手造一次,④ 看当年怎么修的,有三张再请你⑤ 写一句指令,或读一份汇报。
15 · 1几个原因叠在一起,怎么拆
第 13 课的排除法,是在一串嫌疑里找出那一个。可有的毛病是几个原因一起造成的,这时会碰到一个让人犯糊涂的结果:改了一样,毛病轻了,但还在。常见的两个错正好相反:以为这一步改错了,把它撤回去;或者一口气全改,好了也说不清是哪一处起的作用。
叠法有两种,拆法不一样:
- 加在一起:每个原因各贡献一份,拿掉一个只少一份。拆法:先把症状量成一个数,一次加一处修法、量一次,降多少就是这一处的份;降了没到底,说明还有下一个,留着这一处,接着找。卡 7 的闪烁就是这种。
- 缺一不可:几个条件同时成立才出事,拿掉任何一个都好。拆法:每个条件各拿掉一次试试,哪个都修得好,就挑代价最小的那个。卡 6 的重影就是这种。
两种都靠同一件事:症状得先变成一个能量的数,而且那个量法要看得见这种毛病。卡 7 当年栽的跟头,正是量错了东西。
剪切点上,有一帧重影
红魔 v4 交付前自查 · 19.5 秒和 21 秒两个切点这张卡没有留下原帧:交付前自查时发现的,修好才交。前后两个镜头拍的是手机的两面,接在同一条时间线上,所以手机在切点上被一个关键帧瞬间翻了 180°。下面的复现就是它的样子:切点那一帧里,背面和正面叠在了一起。
① 先定位:出在哪一环?
- 画面底子
- 建模
- 材质
- 灯光相机
- 渲染
- 动画
- 引擎
- 后期
渲染或动画都算对:又是两环碰上。动画里那个翻转是瞬间完成的(两个关键帧之间怎么过渡叫插值,这里用「常量」,到点直接跳,第 9 课);渲染时开着运动模糊(第 12 课)。怎么碰上的,下面亲手造一次。
这就是第 12 课的快门台,诚实声明见那一课。这里已经切到「剪切点上的翻转」、停在切点那一帧(第 585 帧,19.5 秒 × 每秒 30 帧)。
把 02 的「快门位置」在「以帧为中心」和「从帧开始」之间来回换:以帧为中心时,第 585 帧的快门从 584.75 开到 585.25,一半的子帧在翻转之前,一半在之后。再拖 03 看前后两帧,它们为什么是干净的?
② 原因④ 当年怎么修的
一行设置:运动模糊的快门位置改成从帧开始(motion_blur_position = 'START'),从这一帧往后采样,切点那一帧就只有翻转之后的样子。交付前自查发现、修好,19.5 秒和 21 秒两处。
这是「缺一不可」的那种:跳变键和跨过它的快门窗口,缺一个都不出事。所以两环各有一条路:把瞬间翻转改成几帧的过渡(动画),或者把快门改成从帧开始(渲染)。挑的是代价小的那条:改一行设置,不碰动画、不改剪辑点。
移动的时候,画面会闪
长卷宣传片 v2 · 一镜到底,每秒 30 帧
「移动的时候,画面会闪烁。这是什么问题?是渲染过程中的问题,还是编码过程中的问题?如果用Windows GPU进行处理,会不会缓解?」
背景(第 11 课):长卷的画是切成一块块小方块(瓦片)画好存起来的;推近时要按新的精度重画,精度分成一档一档,网页上每放大一倍分 2 档。
① 先定位:主要出在哪一环?
- 画面底子
- 建模
- 材质
- 灯光相机
- 渲染
- 动画
- 引擎
- 后期
渲染或引擎都算对。你问「渲染还是编码」,答案是渲染;再往下细分,出在长卷自己那台画画的引擎怎么分档:推近时每跨一档,整屏换一套细节。编码(后期)占一小份:分享版码率只有 2.2 Mbps,平移时纹理会糊会闪。
这就是第 11 课的实验台 E-3:长卷原函数画的一段小镜头,诚实声明见那一课。
照上面的拆法走一遍。帧差曲线就是那个数:拨「02 逐帧看」过第 41、42 帧,看它在换档处冒尖。先加第一处修法,把 01 档位换成每倍 32 档:小尖全平了,第 31 帧那个大尖还在。降了,没到底。
留着它,接着找:大尖是另一个原因,细节分支多抽了随机数(第 11 课)。打开 03,大尖也没了。两处各管一种尖,缺哪一处曲线都不平;要是第一步就撤回,第二个原因就永远藏在第一个后面。
④ 当年怎么查、怎么修的
先认错:v2 交付时写了「闪烁:已修复并验证」,验证用的是整屏平均亮度,看不见局部。重新查:渲一小段快速推拉,把上一帧按镜头的移动挪到和这一帧对齐(运动补偿),再逐帧相减:第 1250 帧,相减后的图里陈家祠的陶塑屋脊整片是亮的(差得多)——它在这一帧换了一套细节。改了五处:视频每倍 32 档、一帧一档;人和船每帧都画;运动模糊按镜头速度自适应、最多 24 个子帧;帧率 30 提到 60;分享版码率提到约 6 Mbps。帧差「最高那一帧」和「一般的帧」之比从 1.33 降到 1.10(越接近 1 越平稳)。至于「用 Windows GPU 会不会缓解」:瓦片是 CPU 画的,换显卡救不了换档。
这五处是一起改的,1.33 → 1.10 是五处合起来的效果:每一处各占多少,这两个数拆不开。「主要在渲染」这个判断是从另一个证据来的:在编码之前的帧上就有跳。实验台里那两处(档位、随机数分流)是一次加一处量出来的,那才叫拆开。
教练走出几米,凭空消失了
投篮课 · three.js 网页上篮那一段,教练助跑出去几米,人突然不见了,球场还在。没有留下截图,下面的复现就是它的样子。
① 先定位:出在哪一环?
- 画面底子
- 建模
- 材质
- 灯光相机
- 渲染
- 动画
- 引擎
- 后期
引擎:每一帧画什么、不画什么,是引擎决定的。下面亲手造一次。
- 来自材料
- 包围球按静止姿势算、留在原点,角色被骨骼带走几米后被整个剔除,修法是对整个角色设
frustumCulled = false:来自投篮课的记录(C44)。 - 本复现的设定
- 水平视野 50°、相机在教练身后 6 米、包围球半径 0.9 米都是本复现挑的;只算俯视的左右两个面。教练在第几米消失由这几个数决定,不是投篮课的实测。
- 它能证明
- 包围球不跟着骨骼走,角色一走远就会被错剔除;两种修法都能让他回来。
- 它不能证明
- 关掉剔除的代价有多大:一个角色无所谓,几百个就要算账。
先说教练是怎么动的:他是被骨骼带着走的,动的是网格上每个点的位置,「教练」这个物体本身的位置一直记在原点。实时引擎为了省事,看不见的东西干脆不画,叫视锥剔除(frustum culling):相机能拍到的范围是一个尖朝相机的锥形(视锥),给每个物体套一个包得住它的球(包围球),球整个落在视锥外,就整个跳过(第 10 课)。把 01 往右拖:相机跟着教练走,可他的包围球还留在原点;拖过 3.8 米左右,球整个出了视锥,右边的画面里教练一下子没了。
② 原因④ 当年怎么修的
对整个教练角色(VRM 格式,网页上常用的人物模型格式)设 frustumCulled = false,不再剔除它。一个角色多画几次没什么代价。
配乐结束以后,还有一句话
广州片 · 199 秒的生成配乐配乐是另一个 AI 生成的,交回来长 199 秒(要的是 100 秒)。音乐在 3 分 11 秒就停了,静了几秒,3 分 16 秒又冒出一句话:「当前内容由 AI 生成」。另一首生成时标着「无水印语音」,3 分 19 秒照样有同一句。这几天广州片和长卷用的 5 首里,4 首有。停在哪一帧画面上都看不出它,要放出来才听得见;而做片子的 AI 连听都听不见。
① 先定位:出在哪一环?
- 画面底子
- 建模
- 材质
- 灯光相机
- 渲染
- 动画
- 引擎
- 后期
后期:声音素材的检查。这一句是生成平台在音频末尾加的提示,一个原因、一环,不用拆。难的是查:做片子的 AI 听不见声音,只能靠语音识别(把声音转成文字)、响度曲线(声音随时间的大小)、频谱(各个音高的分布)去量。量什么,才看得见什么。
- 来自材料
- 整首 199 秒、3 分 11 秒音乐停、3 分 16 秒语音识别听出「当前内容由 AI 生成」、原曲的响度曲线「从 15 秒到 160 秒几乎是平的」、每分钟 89 拍:出自广州片的记录和文章(C08)。
- 本复现的设定
- 声音是浏览器合成的替身,不是原曲:音乐是四个和弦轮换的长音加每拍一下低音;那一句是按普通话的声调画出音高、叠上谐波和两个共振峰的合成音,并不像真人。响度按 0.5 秒(放大时 0.05 秒)一段的均方根电平算,没做 LUFS 的频率加权;频谱每 0.05 秒取 64 毫秒、把 0–3200 赫兹分成 80 个频带。
- 它能证明
- 响度曲线只看得出「那里有声音」;频谱看得出它像人声(一叠跟着音高一起弯的谐波);只有语音识别说得出是哪几个字;只看文件信息、只听开头,什么也碰不到。
- 它不能证明
- 语音识别本身:本页不跑识别,那一行字是当年的结果。真实的配乐更复杂,提示音也可能压在音乐底下而不是藏在静音之后,那时响度曲线就看不出它了,只剩语音识别。
把 01 从上往下换一遍。前两样什么也碰不到,却最容易让人说出「查过了」。响度曲线看得见音乐停了又冒出一段声音,说不出是咳嗽、环境声还是一句话;频谱看得出它像人声。能说出说了什么、也能证明「整首没有这句」的,只有语音识别,而且每一首都要过:标着「无水印」的那首,照样有。
④ 当年怎么修的
把那一句剪掉,让音乐跟着画面一起收住(02 打开就是剪过的样子),配乐再按画面剪成 99 秒,最后一个和弦落在片名上。发布时照样勾选 AI 生成的声明:片子本身就是 AI 生成的,国内发布 AI 生成的内容本来就要标识,剪掉提示音不等于不用标。后来《拾光》的环境声和背景乐里,也查出了同一句。
带走一个问题
这四张卡有一个共同点:挑一帧截图,看不出任何毛病。下一次交片之前,你会要求做哪几项「动起来、放出来」的检查?每一项查的是什么、能证明什么、不能证明什么?
不看上面,写下这一课撞上的几堵墙,再展开对照
- 挑一帧看不出的毛病 → 要在时间里查:快门区间跨过跳变键(C26)、换档的那一帧(C14)、人走远以后(C44)、片子的最后几秒(C08)。
- 改了一处,毛病轻了但还在,就撤回 → 原因加在一起时,一次加一处、量一次,降了没到底就接着找;缺一不可时,拿掉哪个都好,挑最便宜的。一次全改,好了也拆不开每处各占多少。
- 量的是什么,就只证明什么 → 整屏平均亮度抓不到局部换细节;在编码之前的帧上对齐相减,才抓到第 1250 帧。
- 引擎为了省事,会跳过它认为看不见的东西 → 包围球留在原点,人就被整个剔除了。
- 做片子的 AI 听不见 → 声音只能靠量:响度看得见「有东西」,频谱看得出「像人声」,语音识别才说得出是什么;每一首都整首过一遍。