Vim 糙音速剪辑 | rCut >
https://github.com/scateu/tsv_edl.vim 欢迎使用。
缘由
2019年我剪了十几期podcast。一开始很兴奋,后来很疲惫,最后几期是由我[室友]{WiFe}帮我剪的。
录一个小时的内容,得花三小时剪,而且这其间几乎没有创造性劳动。特别是在下还兼host,所以录到一小时左右,guest讲得越来越开心,我却越来越慌 – 因为剪辑实在是太累了。
剪上四五小时精疲力尽之后,根本没有任何意愿去重新安排顺序、剪掉无关的话题、摘取精彩片段。
后来我看到了BBC Media Lab有一个实验性的项目,叫Digital Paper Edit。BBC一直以来用的工作流,就是
- 狂录
- 转写,带着时码打印到纸上
- 标注分类
- 摘取,大剪刀大胶带糊在大纸上
- 送给剪辑师
他们用electron实现了一套很fancy的东西,九个人的团队做的。(我2023年再去看页面已经离职得只剩一位了)
后来descript、adobe podcast都出了类似的方法。但都是租用式服务,或者不支持中文,用着不开心。
所以我自己用Vim实现了一个。
用Emacs打电话,用Vim剪视频,why not。
摘要
用Vim或Excel或Numbers.app或Google Spreadsheet配合字幕剪视频。 (纯音频也可以)
- 定义了一种tsv格式(由srt 1:1转过来)
- tsv实际上就是tab分隔的spreadsheet文件,可以直接用excel打开。tsv(tab)和csv(comma逗号)是同等的。
- Vim可以方便地编辑这个tsv,并唤起mpv来预览。
- 用V选中行
- 按空格,调用
tsv2roughcut
(python脚本,调ffmpeg)导出mp4; - 按
x
,调用tsv2fcpxml
导出成fcpxml文件,送进fcpx或达芬奇再微调
- 按空格,调用
- Vim里按两下
\\
,会后台调起mpv播放器,通过unix socket通信- Vim上下动光标,自动socat给mpv去seek。
- 然后再微调的话,可以在mpv里动进度条,然后再在vim里按
gi
,读当前mpv的位置,并覆盖到这一行tsv的起始时码
Cheatsheet pdf在此,demo在这里。
主要特性
1. 格式简单
* 标题
只要开头没EDL的都算是注释。
## 子段落
EDL⇥00:00:01,000⇥00:00:05,000⇥|⎵image⎵|⇥subtitles….
EDL⇥00:00:01,000⇥00:10:01,422⇥|⎵clipname⎵|⇥[B]this is B-Roll
EDL⇥00:00:01,000⇥00:10:01,422⇥|⎵clipname⎵|⇥subtitles….
*** 子子段落
支持Markdown的#式标题,同时也混乱中立地支持org mode的*式标题。
- srt2tsv,简单到可以用纯sed命令来实现
cat some.srt | sed -n -r '1{/^$/n;};/^[0-9]+$/{n; s/ --> /\t/; s/$/\t| _CLIPNAME_ |\t/; N; s/\n//; h; d;}; /^$/! { H; $!d;}; x; s/\n/\\N/g; s/^/EDL\t/;p' > some.tsv
- clipname处只写文件名,不用带扩展名,会自动从当前目录里依次找
视频>音频>图片
。 - 按
\c
可以借用vim的conceal机制,把前几列隐藏掉 - 所有不带EDL行都可作为注释。
- Markdown/org mode式折叠,按Tab键即可。
- tsv文件仅当前几行有EDL字样才会调起我的插件,其它tsv不用太担心
2. 预览
- 简单预览可以直接在行上按tab键,即可从该行的起始播到结尾
- 按两下反斜杠
\\
可以通过unix socket与mpv播放器通信- 在vim里按上下键的同时会向mpv发送时间码并定位到本行的起始时间码
3. 时间码编辑
- 一行字幕太长的话,可以按竖线
|
来从中间切开(按照字符长度推断)- 按
J
键可以把两行合成一行粘起来
- 按
- 如果这个时间推断的不准,可以先在要切断的字上按
mm
,表示文字要在这里断。然后左右动光标,按tab来预览,听声音,找到对应文字的音频位置,再按竖线|
4. 精选/煎饼式剪辑 Cherrypick / Pancake Editing
- 按
\P
或\p
,出一个新的vim tab,上下按光标(也可以先打开mpv预览) - 选到如意的,按回车,当前行即被粘到另一个tab里。
- 本行用过会变成
---
,以便使你知道这行已经被用了。
- 本行用过会变成
5. B roll
- 可以给podcast配图
- 可以给说话脑袋(talking heads)加配图视频(B roll)
6. HTTP素材导入
- 如果被竖线包围的
clipname
以http
开头,tsv2roughcut
(绑到了V
键选后按空格)会自动用youtube-dl
等工具帮你下回来并合成。而且只下其中要用的那段,而不是整个下回来。 - 如果觉得下载动作太宝贵,
tsv2roughcut
会停下来问你要不要删掉tmp文件夹,此时可以抢救
7. 简单渲染
- 用V键选上几行EDL,如果中间有文字注释也没关系,会忽略。按空格,即调用
tsv2roughcut
渲染mp4. - 甚至可以用grep来剪视频
8. fcpxml导出
V
选之后按x
键,导出成fcpxml,从而可以导入Final Cut Pro或DaVinci Resolve等工具做精调。注意会问你fps,视情况修改。
9. 小工具
audio2srtvideo
把纯音频加上时码和字幕,方便把podcast传B站。顺便,我一个人校对了十几期Voices from DARPA和几期radiolab的podcast,也放B站了- macOS的shortcuts: 在README.macOS.shortcuts.md 里,得手动配。可以用。凑合用。图形界面了算是。
- 其它工具都在utils目录了。都是独立的工具,不是Vim用户也可以用。基本上都是从stdin读,输出到stdout
scenecut_preview
: 把视频的转场点切开,输出tsv文件,并把预览截图输出到子目录audiocut
: 按视频中声音的silence位置切开,输出tsv文件
键绑定
键 | 能 |
---|---|
⇥ (tab) | [mpv] 调mpv播放这一行(从光标位置推断),到此行结束停。 |
⇧⇥ | [mpv] 同上,但从这一行头播,行尾停。 |
\ ⇥ | [mpv] 同tab键,但本行尾结束后mpv不停。 |
\ ⎵ | [mpv] 从本行起一行一行地播。直到文件尾。(相当于成片预览) |
时间码编辑
键 | 能 |
---|---|
J | 把下一行合并。如果本行和下一行的文字都是http开头,会生成一个EDL行,并把clipname填上。 |
| | 把本行在光标位置切断。时间点由字符位置推断。 |
mm | 先mark文字切断点,再左右找时间,按竖线切。特别是在时间推断不准的时候用,很有效。 |
⇧← ⇧→ | 与上一行卷动时码1秒,即本行入码减1秒,上一行的出码加1秒 |
g0 | 跳去字幕列 |
g8 | 去上一行的record_out 出时码位置 |
g9 | 去本行的record_in 入时码位置 |
gO | 在本行后增加一行空隙,时长5秒 |
gN | 在本行后增加一新行,时长10分钟,光标置于clipname字段 |
gB | 切换本行subtitle段是否有’[B]’ |
gb | 同gB |
gc | 计算本行的时长,加到末尾 |
\ c | 隐藏/显示前四列; 从conceallevel=0, 1之间切换; :set nowrap 可能会有用 |
剪辑决策/ BBC纸式剪辑
键 | 能 |
---|---|
\ p | 进入精选模式,在最左边起新标签页。将⏎绑到选择功能 |
⏎ (enter) | 把此行复制到Vim的tab 1,然后将本行标记为--- |
\ P | 进入精选模式,将屏幕横分为二。将⏎绑到选择功能 |
⏎ | 将此行复制到屏幕的另一半里,然后将本行标记为--- |
⌫ (BS) | 拒绝本行,把行首标记为xxx 然后去下一行 |
⌦ (DEL, fn⌫) | 在EDL xxx 之间切换; 会将--- 切回EDL |
V (高亮选择) ⎵ | 把高亮选中的行用 tsv2roughcut 进行简单渲染 |
V x | 把高亮选中的行用tsv2fcpxml 导出 |
MPV IPC CONTROL MODE
键 | 能 |
---|---|
\ \ | 拉起mpv,实际上是做mpv --input-ipc-server=/tmp/mpvsocket --pause clipname.mp4 |
进入IPC 控制模式 s ← → ↑ ↓ ⎵ ⏎ 被重新定义, 再按\\ 这些键的定义复原 |
|
\ \ (再来) | 通过ipc socket给mpv发退出 |
⎵ | [mpv ipc] 放/停 |
← → | 移动,并让mpv播放器的位置定到vim光标的位置 |
↑ ↓ | 同上,注意当clipname有变,mpv会不重启地自动切到新clipname上 |
\ ⎵ | [mpv ipc] 从本行开始播到文件尾 (每一行的时间是猜的) |
⏎ or s | [mpv ipc] 让mpv定位到光标的位置 |
ns | [mpv ipc] 找到下一个词,再seek。大招,很好玩 |
S | [mpv ipc] 从mpv上问到当前时间,然后让vim的光标跑到那一行。 |
\ S | 同上,但向上找。 |
gS | 同上,开启播放头定期同步,每1秒一次,再按关掉。⎵将暂停同步并恢复状态。 |
⇥ | 让mpv定到vim光标处,并让mpv播放. 如在注释区,跳到下一个EDL 行 |
⇧⇥ | seek到行首,然后按tab |
gi | 从mpv处问到当前时间码,覆盖到本行的起始时间码(in) |
go | 同上,但覆盖到本行的结束时码(out) |
- | 从mpv取当前时间,写到本行的out时码,并下移一行,覆盖其in时码。如下一行为纯文本,增加EDL头(便于给纯文本转写加时间轴) |
Orgmode/Markdown 折叠
键 | 能 |
---|---|
⇥ | 不在EDL或—或xxx行,等同于za 切换折叠。## 或** 都算 |
⇧⇥ | 切foldlevel=0,1,2 |
如果在EDL行上,你得按 za zm zr zo zO zM zR |
|
]] | 去下一个heading |
[[ | 去上一个heading |
g] | 去下一个comment行(不以EDL开始) |
g[ | 去上一个comment行 |
项目名
曾用名”超音速剪辑”,不够谦逊。
FOSDEM 2024
去不了现场,但有幸被elvish作者xiaq和openwifi的作者jxj联合代为present。欢迎收看