https://github.com/scateu/tsv_edl.vim 欢迎使用。

缘由

2019年我剪了十几期podcast。一开始很兴奋,后来很疲惫,最后几期是由我[室友]{WiFe}帮我剪的。
录一个小时的内容,得花三小时剪,而且这其间几乎没有创造性劳动。特别是在下还兼host,所以录到一小时左右,guest讲得越来越开心,我却越来越慌 – 因为剪辑实在是太累了。
剪上四五小时精疲力尽之后,根本没有任何意愿去重新安排顺序、剪掉无关的话题、摘取精彩片段。

后来我看到了BBC Media Lab有一个实验性的项目,叫Digital Paper Edit。BBC一直以来用的工作流,就是

  1. 狂录
  2. 转写,带着时码打印到纸上
  3. 标注分类
  4. 摘取,大剪刀大胶带糊在大纸上
  5. 送给剪辑师

他们用electron实现了一套很fancy的东西,九个人的团队做的。(我2023年再去看页面已经离职得只剩一位了)

后来descriptadobe 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素材导入

  • 如果被竖线包围的clipnamehttp开头,tsv2roughcut(绑到了V键选后按空格)会自动用youtube-dl等工具帮你下回来并合成。而且只下其中要用的那段,而不是整个下回来。
  • 如果觉得下载动作太宝贵,tsv2roughcut会停下来问你要不要删掉tmp文件夹,此时可以抢救

7. 简单渲染

  • 用V键选上几行EDL,如果中间有文字注释也没关系,会忽略。按空格,即调用tsv2roughcut渲染mp4.
  • 甚至可以用grep来剪视频
    • eg: Never, never. Bilibili Youtube
    • cat V Dont.Look.Up Inglourious No.Country.for.Old.Men The.Bourne.Supremacy 谍影重重3 Notting.Hill | grep -e god -e love -e beep -e shit | sort B

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文件

shortcuts

work flow

键绑定

⇥ (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。欢迎收看