面向产品经理的Emacs教程:31. 通过Emacs来看视频

· 1614字 · 4分钟

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

我不需要弹幕,也不看直播,所以没有安装 danmaku2assseam ,需要的朋友自行安装。

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."))
  )
  1. 其依赖的 emms 包会自动下载安装。
  2. 我修改了默认的在 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

你也可以在 这里 查看最新的配置文件。