1 课程回顾 🔗
通过上节课,我们了解了如何在 Emacs 里使用浏览器,我们可以通过 EWW 来浏览一些文字型的网页,并且达到一个非常好的去广告效果,我们可以通过强大的 EAF 在 Emacs 里使用真正的 Chromium 浏览器,非常强大。
今天我们来学习如何通过 Emacs 来看视频。
2 概述 🔗
肯定有同学会纳闷,看视频就是看视频,为什么要通过 Emacs 来看视频,有什么好处?为什么看个视频还要搞的这么麻烦?
你是否曾经遇到这样的场景呢?
- 你正在看一个教学视频
- 边看视频边做笔记(电子笔记)
- 时不时需要截屏
- 还要能让自己做的笔记和视频的时间戳对应上
- …
而要实现上面的场景,我们完全可以通过 Emacs 来做到,通过 Emacs 的 Org mode 来记笔记,通过我们今天要介绍的 mpvi
来实现上述功能。
3 mpvi 🔗
mpvi 插件可以让 Emacs 来控制 mpv 视频播放,并与 Org-mode 结合起来。
mpvi 插件是 emacs-china 论坛的一位道友开发的,之前名字叫
org-mpvi
,经过改版后,非常好用了。
3.1 mpvi 安装 🔗
3.1.1 依赖 🔗
我们先安装相关的依赖,其中 mpv
是播放器, yt-dlp
是看网络视频的, ffmpeg
用来做视频剪辑操作的, tesseract
用来识别文字:
brew install mpv yt-dlp ffmpeg tesseract
我不需要弹幕,也不看直播,所以没有安装
danmaku2ass
和seam
,需要的朋友自行安装。
3.1.2 安装 mpvi 插件 🔗
(use-package mpvi
:ensure t
:commands (mpvi-open mpvi-seek mpvi-insert)
:bind (("C-c v o" . mpvi-open)
("C-c v s" . mpvi-seek)
:map mpvi-seek-map
("C-i" . my/mpvi-seeking-capture-as-screenshot))
:config
;; 如果不设置这个值,会提示ipc的错误需要你update mpv
(setq emms-player-mpv-ipc-method 'ipc-server)
;; 通过这个函数来对视频截图,我不喜欢使用attach的方式
(defun my/mpvi-seeking-capture-as-screenshot ()
"Capture current video screenshot and insert as a link."
(interactive)
(with-current-buffer (window-buffer (minibuffer-selected-window))
(unless (derived-mode-p 'org-mode)
(user-error "This is not org-mode, should not insert org link")))
(with-current-buffer (window-buffer (minibuffer-selected-window))
(when (mpvi-parse-link-at-point)
(end-of-line) (insert "\n"))
(let ((foldername (concat (file-name-base (buffer-file-name)) ".assets/"))
(imgName (concat "img_" (format-time-string "%Y%m%d_%H%M%S") ".png")))
(if (not (file-exists-p foldername))
(mkdir foldername))
(let ((imgPath (concat foldername imgName))
(relativeFilename (concat (file-name-base (buffer-name)) ".assets/" imgName)))
(mpvi-screenshot-current-playing imgPath "video")
(insert (concat "#+DOWNLOADED: screenshot @ "
(format-time-string "%Y-%m-%d %a %H:%M:%S" (current-time))
"\n#+CAPTION: \n#+ATTR_ORG: :width 600"
"\n#+ATTR_LATEX: :width 1.0\\linewidth :float nil\n"
"#+ATTR_HTML: :width 600"
" :class zoomImage\n[[file:" relativeFilename "]]"))
))
(org-redisplay-inline-images))
(throw 'mpvi-seek "Capture and insert done."))
)
- 其依赖的
emms
包会自动下载安装。- 我修改了默认的在
mpvi-seek
界面下的快捷键C-i
,绑定到了我自己喜欢的截图方式。
3.2 如何使用 🔗
3.2.1 打开视频 🔗
通过 C-c v o
打开一个视频文件,此时会自动调用 mpv 软件来播放这个视频。
3.2.2 视频播放控制 🔗
视频播放控制,最重要的命令是 mpvi-seek
,我绑定到了 C-c v s
快捷键上,按下后,在迷你缓冲区里会展示当前视频的相关信息,如:
- 当前时间戳
- 总时长
- 播放进度
- 当前播放状态
- 播放速度
我们可以在迷你缓冲区通过 SPC
(空格键)开控制视频的播放与暂停,通过 j, k
控制播放速度,通过 n, p
控制播放进度,通过 C-i
来将当前视频画面截图并插入到Org文档里(这个快捷键绑定的是我重新的函数,具体看上面的配置),其他的操控命令和快捷键如下:
快捷键 | 说明 | 条件 |
---|---|---|
, , | 播放链接 | 光标在视频链接上的时候 |
, s | 进入到 mpvi-seek 界面 | 光标在视频链接上的时候 |
, a | 更改视频开始时间 | 光标在视频链接上的时候 |
, b | 更改视频结束时间 | 光标在视频链接上的时候 |
, v | 预览视频时间戳位置的画面 | 光标在视频链接上的时候 |
, c | 视频下载转码截取等 | 光标在视频链接上的时候 |
i | 在buffer中插入时间戳链接 | 光标在 mpvi-seek 迷你缓冲区界面 |
SPACE | 暂停与播放 | 光标在 mpvi-seek 迷你缓冲区界面 |
C-i | 插入当前视频截图 | 光标在 mpvi-seek 迷你缓冲区界面 |
j/k/l | 调整播放速度 | 光标在 mpvi-seek 迷你缓冲区界面 |
n/p/N/P/M-n/M-p/C-l | 调整播放进度 | 光标在 mpvi-seek 迷你缓冲区界面 |
r/C-r | 对当前播放页面进行OCR识别并复制结果 | 光标在 mpvi-seek 迷你缓冲区界面 |
t/C-t | 复制当前页面的字幕 | 光标在 mpvi-seek 迷你缓冲区界面 |
v/C-v | 切换网络视频 playlist 里的视频 | 光标在 mpvi-seek 迷你缓冲区界面 |
o/C-o | 切换到默认程序打开当前视频 | 光标在 mpvi-seek 迷你缓冲区界面 |
q/C-q | 退出 minibuffer | 光标在 mpvi-seek 迷你缓冲区界面 |
3.2.3 在Org文档里记视频笔记 🔗
mpvi
除了能很方便的通过快捷键来进行播放控制外,还有一个非常棒的作用,就是一边看视频,一边做笔记。我们可以在 mpvi-seek
时按下 i
键插入当前视频的链接:
这个链接的展开形式如下:
我们可以把这个链接当作一个 Org-link 来对待,比如使用 C-c C-o
打开这个视频,并跳转到该时间戳。
当我们发现在视频的某一个画面非常好,需要截图插入到 Org 文档中,我们可以使用 C-i
来插入当前视频画面,非常方便:
4 结语 🔗
通过今天的学习,我们了解了如何在 Emacs 里通过 mpvi
插件来看视频,并且与 Org-mode 结合,非常方便的来记视频笔记。
这节课的配置文件的快照见:emacs-config-l31.org
你也可以在 这里 查看最新的配置文件。