2024-06-26

用mpv做簡報

 前面提到用mpv可以看youtube並且載入不同語文的字幕,後來想到是不是可以利用自製的vtt格式字幕來搭配mpv播放影片做簡報?

 一樣是影音播放軟體,VLC可能比mpv更出名,但我認為mpv比VLC好用,因為mpv可以在command line加上各種參數或由script來執行,達到把各種組合自動化的結果。

 這個試作是以最基本的簡報為目標,只用「圖片+文字」來構成,對於不想使用現成簡報軟體的時候,mpv是個不錯的選項,可以透過python或bash script呼叫ffmpeg,把「圖片、文字」組合成影片,再交給mpv播放,就達到基本簡報的目的了。

 關於影片製作以及字幕時序,是以每一秒換一張圖、一次字幕來算,或許會懷疑一秒不是太快了?不會!因為可以控制mpv的播放速度,如果設為0.1倍,原本的速度就變成10秒換一張圖、一次字幕的簡報速度。如果10秒不夠,那就按下暫停在某一張圖,便有充裕的時間進行講解,然後前進到下一個畫面,直到結束。

 vtt字幕的格式,以"WEBVTT"為第一行。
-----------
WEBVTT

1
00:00:00.000 --> 00:00:00.900
簡報文字第一行
簡報文字第二行

2
00:00:01.000 --> 00:00:01.900
簡報文字第三行
簡報文字第四行

3
00:00:02.000 --> 00:00:02.900
簡報文字第五行
簡報文字第六行

-----------
將文字檔存成例如 present.vtt 的檔名。1是搭配第一張圖的文字,2就是搭配第二張圖的文字,以此類推,可以只用一行,或很多行也可以,字很多的話,再把字體調小一些。

假設有十張圖要做簡報,我們用ffmpeg來組合圖片變成影片:
ffmpeg -framerate 1 -pattern_type glob -i 'present*.jpg' -c:a copy -c:v libx264 -r 1 present.mp4
"-framerate 1" 是一秒一張圖的意思(一般影片是30fps,一秒播30張圖),之後用mpv來播放時再把速度放慢到 "--speed=0.1" 就是一秒的十分之一,變成一張圖停留10秒(最慢可以設成 0.01秒,就是一張圖會停留100秒)。

然後在播放影片時,帶上自己做的字幕,播放時用的最基本參數是:
mpv --speed=0.1 present.mp4 --sub-file=present.vtt

mpv帶字幕時還有很多參數可用像是:
 --sub-border-color=\#000000\
 --sub-border-size=3\
 --sub-color=\#d0d0a0\
 --sub-shadow-color=\#2020d0\
 --sub-shadow-offset=15\
 --sub-back-color=\#3506080a\
 --sub-visibility=yes \
 --sub-align-x=left \
 --sub-align-y=top \
 --sub-pos=95\
 --speed=0.1\
(詳細說明請參考man mpv)

這樣製作出來的簡報mp4影片及自製字幕vtt加起來體積很小,很方便攜帶或傳送。

如果有RP2040微控器,也就是Pi Pico或Waveshare Zero之類的,焊上一個紅外線接收器,可以搭配circuitpython加上irremote(紅外線遙控)以及 adafruit-hid 來模擬鍵盤。
circuitpython的code.py可以加上以下模擬鍵盤的控制

kbd.send(Keycode.SPACE) #mpv 暫停/播放
kbd.send(Keycode.V) #mpv 字幕 顯示/隱藏
kbd.send(Keycode.LEFT_ARROW) #mpv 倒退10秒
kbd.send(Keycode.RIGHT_ARROW) #mpv 前進10秒
kbd.send(Keycode.SHIFT, Keycode.LEFT_ARROW) #mpv 倒退1秒
kbd.send(Keycode.SHIFT, Keycode.RIGHT_ARROW) #mpv 前進1秒
kbd.send(Keycode.R) #mpv 字幕上升
kbd.send(Keycode.SHIFT, Keycode.R) #mpv 字幕下降
kbd.send(Keycode.SHIFT, Keycode.G) #mpv 字體變大
kbd.send(Keycode.SHIFT, Keycode.F) #mpv 字體變小
(這些都是mpv內建控制播放用的按鍵。)