Introducing Trimly

拍完只是第一步

过去几年里,包括你我在内,越来越多的人购入了各种各样能拍视频的电子小玩意:手里拿的,身上挂的,甚至天上飞的。与此同时,人手一支的智能手机的视频性能也在迅猛发展,许多过去只在专业视频机上才能看到的参数和功能,普通人点几下屏幕便可轻松用上。

如果有幸真的在过着一个值得记录的美好生活的话,这些技术进步自然要善加利用。日常逛街遛娃吃吃喝喝、周末短途出游、长假上山下海走遍世界,每次回到家都会产出少则数 GB,上不封顶的大量视频文件。在插着存储卡拷贝文件时,难免陷入思考:拍是拍完了,然后呢?

拍视频那自然是为了看。但与照片不同,视频文件实在是太大了,大到哪怕钞能力拉满,开个 12TB 的 iCloud,仍然没法优雅解决「我想随时看之前拍的东西」的问题:超大视频是绝无可能放到手机里的,这意味着每次想看的时候,都要现场从云上拉取。视频越大,loading 时间越长,足够让人失去耐心。

看到这里,你可能会说 NAS 等 self host 存储方案。这个理论上是可行的,但还是有几个问题:

  • 多谢 AI,硬盘价格已经起飞了,并且一年半载内看不到回落的迹象
  • 国内家用网络的上行带宽是很有限的,在公网环境 load 家里的高码率视频时,等待过程仍然很痛苦
  • 维护 NAS 以及稳定的公网访问,仍然需要一定的技术门槛和持续工作量

同时,我还有以下几个假设:

  • 绝大多数的人都并不是所谓的「内容创作者」,专业的视频内容制作并非我们的兴趣,因此也不需要特别多「素材」的概念
  • 承认吧朋友们,大多数扔进 NAS 里的东西,基本就是吃灰的命。特别是长视频,你是绝对不会再把它们掏出来完整看一遍的。
  • 在持续拍摄记录的过程中,我们真正会每次打开都能露出笑容的,都是一些散落其中的片段,短则数秒(甚至只是一张 live photo),长则一两分钟。其余很多内容并无长期保存必要

于是,一个理想的视频工作流应该是这样的:

  1. 持续录制长视频
  2. 从长视频中剔除无意义、纯浪费时间和存储的片段,保留下相对有意思的部份,存入硬盘/NAS 等冷存储目的地
  3. 再从有意思的部份中,挑出一些真正会反复观看的精华短片,保存到 iCloud 相册中,所有设备都能随时随地回看
  4. 如果有时间的话,把有意思的部份作为视频素材,剪辑一些轻度的 vlog 等作品

带着以上明确的需求,我开始搜索 Apple 生态里能满足的工具。但最后惊讶的发现,从剪映到达芬奇,或者苹果自家的 iMovie 和 Final Cut Pro,抑或 App Store 里浩如烟海的 app,没有一个能把这件看起来不是很复杂,但对整个工作流至关重要的事情做对。

于是,作为一个近 20 年的苹果产品用户,以及有多年专业音视频开发经验的技术工作者,我给自己,以及可能也有类似需求的你,做了一个把 「从长视频里截取片段」 这件事做到极致的产品:

  1. 能简单的在视频里标记很多个或长或短的片段或者截图/live photo 时刻,然后一键把这些内容导出到 Apple Photos 或者文件系统
  2. 导出内容的时间戳要能对应其真实时间,这样才能在 Apple Photos 里和其他照片/视频正确排序,不像微信发过来的那样全是乱套的
  3. 其他媒体元数据,例如拍摄的 GPS、设备、镜头等信息,都尽可能和原始视频保持一致
  4. 要能正确保留 HDR 视频与图像
  5. 要能直接在预览和导出时应用 LUT,不用再打开那些又大又沉的专业视频编辑器
  6. 尽可能像苹果自己做的一样,不需要特别 fancy 的交互,但一定要能稳定高效解决问题

我把它叫做 Trimly.

Trimly is an adverb that means in a neat, orderly, smartly arranged, or well-groomed manner. It describes actions done with tidiness and smart appearance, and is the adverbial form of the word “trim”

How Trimly Works

原生开发,全平台支持

既然目标是「像苹果自己做的一样」,那肯定是要 iPhone/iPad/Mac 都要支持的。得益于现代的 Apple 开发框架,SwiftUI 已经能比较好的实现一套代码,根据不同的屏幕尺寸和设备特征实现响应式布局。

同时作为 What’s a Computer 的资深受害者,我对 iPadOS + 外接键盘/显示器,以及 Stage Manager 下的可缩放窗口等偏门使用场合都做了深度优化。

另外值得一提的是,Trimly 除了 iCloud 外,没有账号系统且完全不连网。同时使用了 0 个第三方库/SDK,所有功能均通过 Apple 第一方 API 实现。不得不说,现在的 AVFoundation/CoreImage/CoreGraphics 确实已经非常完备了,很多以前需要 libffmpeg 才能实现的功能,现在都能自己做好

符合预期的导入导出

无论原始视频是在 Apple Photos 还是文件系统,Trimly 都会直接读取原始文件(哪怕是在外置硬盘)然后添加剪辑点和导出。几十 G 的视频文件,如果还要加个复制导入流程,很有可能直接撑爆内置存储。

对于导出过程,除了上面提到的保留 HDR 和支持套用 LUT 外,Trimly 还支持不同档位的转码,包括不转码的 passthrough 模式,以及在画质/文件大小之间的不同取舍。不同人对 Apple Photos 里该放多大的东西有不同的需求。

Trimly 希望可以让所有用户都不用再二次转码视频。

Metadata 智能处理

在某个版本的 iOS 相册支持显示 EXIF 信息后,越来越多的用户开始希望自己的媒体内容都能有正确的 metadata,就像很多年前 iTunes 让我们重视音乐的专辑与 ID3 信息一样。

Trimly 会给导出的视频尽可能保留全部的metada. 与此同时,还会根据导出内容在原始视频中的偏移量,智能计算导出内容的时间戳。

举个例子,很多人在看演唱会时会一直拿着 Pocket 录像,同时手机也在不停拍照。Pocket 录制的原始长视频的时间戳是起始时间,如果导出一个五分钟到五分十秒的片段,Trimly 会把这个五分钟的偏移量加上去,这样在 Apple Photos 中,该片段会出现在前五分钟手机拍摄的照片之后。

一些 Apple 自己都不那么上心的功能

iOS 8 推出的 Handoff 功能我非常喜欢,但很少有看到第三方 App 能把这个功能做到真的有用且好用,大多数时候,它只是在 Dock 上一个碍眼的图标。

在开发 Trimly 时,我发现自己有一个真实需要这个功能的场景:在电脑上添加剪辑点到一半时,突然需要出门或者去卫生间,但心流不想被中断。因此,我实现了编辑记录的 iCloud 同步,以及授权文件夹内的检索功能。这样,只要两台设备的访问范围里都有相同的文件,就可以无缝接力同步了。

定价

在开发 Trimly 的过程中,相当多的技术选型与架构设计,特别是涉及音视频处理管线的部份,以及和 PhotoKit 打交道的各种技术细节,都远比我预期的复杂。能把所有功能做到 just works,还是具有一定门槛,不是随便 vibe coding 就能轻松做出来,并且整个架构做到清晰可维护的。

在过去几个月里,我自己一直是 Trimly 的头号用户,持续深度使用几乎每一个功能,并尽力打磨每一个细节。目前的完成度也自认为远超绝大多数 vibe 的半成品。

与所有人一样,我痛恨订阅制收费,并且一直是一次性付费模式的拥趸。因此,我设置了发展中地区6元/1美元,发达地区3美元的定价。一次购买,全平台可用。考虑到这是一个可以重塑整个工作流的工具,我认为还是相当便宜的。‌

希望 Trimly 可以帮到和我一样有类似需求的朋友。

官网:https://trimly.zshbleaker.me

最近几年里逐渐意识到,生活所许诺的各类奖赏,无论其取悦肉体还是精神,都难免于被归类为某一种形式的premium mediocre,带给个体的欢愉更多(如果不是全部)源于其在社会结构中的符号性意义。一个自由的,作为符号系统的主人而非奴隶的个体,在审视橱柜中的各类藏品时,也许所看到的更多是蹩脚的阿谀奉承。

成为上面提到的自由人并不困难,但鲜有人还能坐拥足够的资源与天赋去亲自编撰自己的符号系统——通过探索或创造。但低垂的果实早已被先人摘尽,庸人擅长解构一切,却总是为时太晚才能发觉文字夯实的路基被无情铲除的同时,道路指向的终点(即使不一定是美好的)也随之消失。

退一步说,终点是必要的吗?无限重复的日常本身是否已经包含了足够的神圣性,从而替代某种终极目标来支撑我们的存在?如果单一种类的日常还做不到,那是否可以通过不断累加体验足够多种类的日常,尽可能把散落在各处的拼图凑出接近完整的图像?

但资源是有限的,为碎片赋予优先级的逻辑重要但却扑朔迷离。一种可能的实践方式:回望人生的早期,刚刚可以接收其形式但无法进行解读的年纪。那时一切都是神秘且先验的密文,就像从符号的大海里随机拉起渔网,捞起的生物足够花上整次航程去为之赋予独特的意义。一种人生的Reconquista.

高度分工的现代社会中的智识工作距离其实际创造的价值是如此遥远——如果有幸不是完全没有创造的话——以至于一系列在过去一般会被认为是贵族习气的思维与行为方式不得不被普遍引入,用于缓解长期处于这种大量消耗实际价值而无可感知的产出的环境中带来的自我认同危机。

价值创造链条最末端的工作一定伴随着辛劳,磨损着人的肉体与智性。能免于这些苦役,至少应当带着些幸运者对不幸者的愧怍,去看待那些法理上与自己尚属统一共同体的人。

银弹也不是没有,而且早在文明的黎明时期就已被发明:将劳役者从自己的群体彻底切割出去就好。雅典智者的思辨诞生在奴隶制上,高贵的斯巴达武士也是被希洛人供养,但这种仅从逻辑上把人分类的行为显然不符现代观念,并斥之为奴隶制,随之通过技术推出了一系列修正方式。

但现代人使用一个冰柜,与一个巴格达老爷支使数个奴隶整日维护冰窖又真的有本质区别吗,使用者同样是(甚至是以远远更低的成本)获得了无需其自己亲自劳动产生的价值,只不过机器不是人类,不会投票罢了。缺少对劳作的肉体性感受,哪怕是如此渺小的场景,都会种下危机的种子。

我们常怀念70年代时那种「最流行的文化产品就是最好的文化产品」的时代风貌。其成因可能与文化产品的稀缺性前提下,普通人的购买行为很大程度上受到杂志等把关人一样的评测媒体的影响。

如果你一个月只能买一张唱片,那么这张唱片最好是优质一点的;但今天任何一首歌,无论好坏,聆听成本都只是搜索-播放,并且艺术家的报酬极大取决于播放量。

这就导致了人听音乐这件事变成了一个几乎是没有一个决策过程的东西,类似没有门槛的普选,最高票花落谁家就显然不是一个理性过程了。

更容易理解的比喻可能是阅读自媒体文章和阅读一本书。应该不会有人在关注一个公众号之前去什么「公众号评论」,但买一本书之前几乎一定会读书评。

语言本身像是一张网,每一个词语作为节点错综复杂的连接着,构成了一个拓扑系统。我们在前半生往往投入了大量的时间在从外部世界中遴选符号,编入自己的网。但年轻的它是干净裸露的,每条线上粘着很少的东西

肉身体验像是把网格浸入颜料桶,线上粘着的颜料的形态与质地,为网格的拓扑结构提供了额外的信息。现实世界附着在语言上

当我们遣词造句的时候,词语节点之间的连线与声带同步震颤,「意义」由飞溅起的五彩颜料所折射出的光线构成,而非干涩的震动本身

高中时看到过一个说法,忘了书名了,大意是现代性问题的一个重要诱因是技术使人可以非常轻松的获取生活必须品。人类基因被进化成成必须不断解决问题才行,想当长的时间里吃饱穿暖是一个必须要解决,有一定难度但也不是遥不可及的问题。这个问题不复存在后,人类发明了相当多符合这一特征的问题系统来满足本能。

但现代社会里,大多数问题要么很好解决要么压根没法解决,各种常见的自创的问题系统也被解构的七七八八很容易一眼望穿自娱自乐的本质。锻炼也好读书也好看世界也好,归根结底是所谓让人成为更好的自己,也就是提高解决问题的能力,反而更暴露了缺乏合适的去解决的问题这个事情。

长话短说 in an offensive way 就是… 吃饱了撑的。尝试切换到一个需要耗费几乎全部体力和精力才能生存下去的生活方式里,精神生活会以一种更加质朴刚健的方式被重新呈现。