緣起:
說好聽點是保存啦,說難聽點就是..... 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 的功能關掉,不然它會去猜你的影片是什麼內容,然後到網路上下載可能對應的節目或電影封面,也會自動更名,啊重點是我那些影片就跟那些完全無關,所以看到國文課的封面跟介紹變成 "機動戰士-高達",真的超怪。

沒有留言:
張貼留言