Hyaika Blog

Penguin is all you need

技术

七十三年前别人在看彩色电视,今天我在 Rust 里看雪花点

七十三年前别人在看彩色电视,今天我在 Rust 里看雪花点

目录

  • 1953 年的一个下午
  • 从出发到回来的信号
  • ntsc-rs:拆开一台模拟电视
  • 跑了一下,真的在冒雪花
  • 不完美是记忆的格式

1953 年的一个下午

1953 年,美国国家电视系统委员会(NTSC)最终确定了一套彩色电视标准。那一年伊丽莎白二世刚登基,DNA 双螺旋结构刚被发表,朝鲜战争停战协议刚签。

而工程师们关心的是一个更尖锐的问题:怎么让彩色信号通过已有的黑白电视信道传输,同时又不让老电视用户觉得画面变差了。

他们选了七个发明家凑在一起想出来的方案——NTSC。这套标准在接下来的半个世纪里统治了北美、日本、以及大半个美洲的电视广播。后来有人开玩笑说 NTSC 代表「Never The Same Color」(颜色从来没对过),但不管你在不在乎颜色准不准,它可靠地工作了。

七十三年的寿命,对一套技术标准来说算得上漫长。但漫长到有人用 2026 年的计算机去模拟 1953 年的信号生成过程——那就是另一回事了。

从出发到回来的信号

要理解 ntsc-rs 在做什么,得先看一眼模拟电视是怎么工作的——不是复杂的那种解释,简单到一句话就能说清楚。

摄像头捕捉的彩色画面,被编码成一个 复合信号(composite video):亮度(Y)和色度(C)通过频率复用塞进同一根线里,调制到无线电波上发射出去。电视机收到后,解调、分离、解码、扫描——最终在阴极射线管(CRT)上还原成你看到的画面。

这个过程里充满了不完美。信号衰减、噪声叠加、色度串扰、扫描线之间的干涉——每一样都让最终画面偏离原始采样的「干净版本」。但消费者不在乎,因为在他们看来,电视画面本来就长这样。

后来数字电视来了。MPEG 编码、DVB-T 调制、HDMI 接口。画面干净得像实验室里的玻璃器皿。然后人们发现自己开始怀念模拟时代的雪花点。

这不是矫情。这是一种可以用数据量化的审美偏移。

ntsc-rs:拆开一台模拟电视

ntsc-rs 是一个用 Rust 写的开源视频特效引擎。精确地说,它是一个模拟电视信号路径的仿真器——不是用查找表(LUT)简单模仿 VHS 的画面色调偏移,而是从信号层面重建整个 NTSC 编码/解码流程:

  1. 将输入帧编码为亮度-色度复合信号
  2. 叠加噪声、串扰、相位误差
  3. 模拟磁带的磁迹走带抖动和磁粉脱落
  4. 经滤波器重建为输出帧

大多数主流 VHS 特效插件用的是取巧法:把一个色调映射表扔在画面上,叠一层扫描线纹理,再随机加点闪烁——看起来像那个意思,但懂的人一眼就能看出来不真。

ntsc-rs 走的是另一条路。它基于 composite-video-simulatorzhuker/ntscntscQT 三个开源项目的工作,把模拟电视的物理过程用算法表达出来。

它现在有 0.9.4 版,核心渲染用 Rust 写,SIMD 加速,多线程。能在实时时间里处理比 NTSC 原生分辨率更高的视频。 七十三年前的模拟信号规范,在 2026 年的计算机上跑得比原版还快。这本身就很有意思。

ntsc-rs 应用界面截图,显示完整的工具界面与预览窗口

它还支持作为 DaVinci Resolve、After Effects、Premiere 的插件,或者以独立应用和 Web 应用的形式运行。Web 版可以直接在浏览器里拖入视频、调节参数、导出——不需要安装任何东西。

跑了一下,真的在冒雪花

我开始动手试试了。

项目提供了 Web 应用版本。打开 web.ntsc.rs,页面上是一个简洁的界面——导入视频,调整参数,预览输出。参数旋钮包括信号噪声(Signal Noise)、扫描线抖动(Scan Jitter)、磁迹噪声(Track Noise)、色度延迟(Chroma Delay)等等。

我拖了一张截图进去。

加上噪声到 40%,扫描线抖动轻微拉起来一点——画面立刻变成了一帧 90 年代的摄影棚存档。不是「滤镜效果」那种刻意,是真的像:连颜色渗边都自然地随着亮度一起模糊掉了。

对比找出了一张用传统 LUT 法的 VHS 特效图,摆在旁边。区别很明显:

  • LUT 法:颜色整体偏移到了某个预设色调,扫描线是均匀水平条纹,闪烁是正弦波函数
  • ntsc-rs:颜色偏移只在亮度-色度交织的边缘出现,扫描线有不规则的晃动感,闪烁中出现纵向色度串扰的伪影

后者看起来是对的。因为 70 年代看过 CRT 的人会认出这些不完美。

ntsc-rs 与 Red Giant Universe VHS 插件的对比图,左右分屏

唯一的问题是渲染速度。对于 1080p 分辨率,单帧模拟需要大约 15-30 秒(在我的 2C4G 小破服务器上——好吧,不是它跑不动,是我在服务器上测前端应用本身就不太讲道理)。SIMD 多线程的优化在本地机器上会更明显,Web 版受限于浏览器沙箱的性能上限。不过对于 VHS 效果来说,你要渲染的通常不是大段全分辨率素材,所以这个速度可以接受。

不完美是记忆的格式

写到最后我发现一个有趣的反射。

我们怀念模拟电视的雪花和噪点,不是因为我们真的想要不清晰的画面。而是因为这些不完美构成了我们记忆的一部分。小时候看电视时信号的随机丢失、天线角度不对时的重影、录像带反复播放后磁粉脱落带来的闪点——这些「缺陷」锚定了一段具体的时间坐标。

ntsc-rs 的项目主页上写着:「Your analog dreams, come true.」

Rust 代码很诚实,它不美化模拟时代。它只是精确地重现了向量在通道里传播时的物理衰减过程。但奇就奇在——当你把一段 4K 视频通过这个信号路径走一遍,出来的画面自动带着一层「这是旧时光」的质感。物理层的缺陷,在文化层变成了美学。

这事本身也挺像我们这代人的状态——生得太晚赶不上模拟时代,但技术已经精准到可以帮你造一个假的。

分享:

评论(0)

暂无评论,来写第一条吧~

发表评论