搜尋此網誌

2026年8月27日 星期四

教學影片保存

緣起:


    說好聽點是保存啦,說難聽點就是..... pirate !!!!之前報的補習班,我是報線上課程,它們有把影片都先拍好,放到線上學習平台上,讓你自己安排時間去看。雖然可以無限次數觀看,但有期限,從買下課程後算起,最多兩年,所以還是有時間內看完的壓力。

    怎麼辨呢,我很不喜歡這種被死線綁住的感覺,而且它那個系統也不會紀錄你看到哪,每次重連去看都要再找一下是哪一部,點進去影片或是拖拉進度都要等網路,幾次後就會感到很煩,降低學習意願 (應該不是我懶吧?)。最後想到,乾脆把影片載下來好了,只要我不散播、拿去做營收,只給自己看的話應該不至於被補習班查水錶吧(?

    這系列有三部曲,第一部是最簡單的下載,第二部是播放器篇,最後是字幕擷取篇。



下載:


    那種線上影音通常都會做保護,所以你沒辦法輕易的對影片右鍵 -> 下載,不過我透過開啟網頁的開發人員工具,看 Network 區塊,發現影片在載入時,它有請求一個 m3u8 資源,而且它還把 token 用 get 的方式帶到網址,也就是說,我可以直接把網址餵給 ffmpeg,ffmepg 會自動處理後續的事情,依序下載每個 chunk,再把它們組成一個完整的影片。

    影片可以成功下載後,接著要做的事是編碼,它們的影片都是用 h264 編碼,我想轉成 h265,壓縮率較高,有時甚至能減少原本一半的空間。但有部份的影片還蠻怪的,轉成 h265 後反而變更大,不過也不會加多少了,我看都是多 100 MB 左右,所以就不去管它們了。

    我一開始還很白痴的,先用 ffmpeg 把原始影片抓下來,等它完整載完後,再下一次 ffmpeg 指令轉碼。後來發現,其實可以下載的同時轉碼,ffmpeg 能邊抓片段邊轉碼,整個指令寫下來是這樣

ffmpeg -i "<m3u8網址>" -c:v hevc_nvenc -preset p5 -cq 28 -c:a copy ./<檔名>.mp4
 

   我用我有的兩張 sim 卡,各自插在一台 4G LTE Wifi 分享器上,分給我 MSI 筆電跟桌電跑 (它們兩都有 nvidia 顯卡),連續載了幾天,才終於把所有的課程都載完,那些檔案總共 220 多 GB,不知他們那邊的平台營運商有沒有注意到這異常大的流量 XDDDD。


JellyFin:


    我把載下來的影片依科目用資料夾分類,用 Samba 傳到 raspberry pi 管理的外接硬碟裡,這樣想看的時候隨時都能看。但如果單純用檔案功具來瀏覧,還是會碰到跟雲端平台一樣的問題,就是它不會幫我記錄我看到哪,所以我再去找工具。

    後來選用,Jellyfin,可以跑在 Container 裡,很適合把這任務交給我的 Raspberry Pi 5


這是 docker compose 檔

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    user: "${UID}:${GID}"
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /media/birdshiu/share/Jellyfin:/media:ro
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped
    ports:
      - "8096:8096"
      - "7359:7359/udp"

    重點是 media 的掛載點,我在外接硬碟的根目錄建了一個 Jellyfin 資料夾,把影片資料夾都放在裡頭,之後操作 Jellyfin 新增媒體時,那資料夾就是它能看到的根目錄,加上 :ro 把它設成唯讀。

    devices 那邊是讓 Container 能看到 GPU 裝置,使用 GPU 做硬體解碼,但我在查詢資料的過程中似有看到說,Jellyfin 目前不支援在 Pi 上使用硬體解碼功能,它是直接讓 Pi 傳原始資料,然後給客戶端自行做解碼。

    Jellyfin 的預設 port 是 8096。

    Container 跑起來後,用瀏覽器進入,第一次進入它會要你設定 admin 帳號,再來是新增媒體庫,在新增時要注意,把自動 Download Meta Data 的功能關掉,不然它會去猜你的影片是什麼內容,然後到網路上下載可能對應的節目或電影封面,也會自動更名,啊重點是我那些影片就跟那些完全無關,所以看到國文課的封面跟介紹變成 "機動戰士-高達",真的超怪。


沒有留言:

張貼留言