一位親戚寄給我幾張DVD,裡面是以前刻錄過家庭錄影。問題是,我沒有DVD播放機,2026年大多數人也沒有。這些光碟就一直放在盒子裡,慢慢變得無法播放,裡面記錄著沒人能看的珍貴回憶(真是太可惜了)。

所以我從亞馬遜買了個便宜的USB DVD光碟機(大概25美元,Amicool A11),想著把光碟裡的影片翻錄出來,然後放到家人都能看到的地方。我現在對程式設計很感興趣,所以用了Claude Code,寫了個流程,把光碟裡的影片翻錄出來,然後上傳到一個私密的串流網站,這樣全家人都能用手機看。

以下是我們的做法。

你需要什麼

軟體方面,所有工具都是透過 Homebrew 安裝的免費命令列工具: ddrescue用於抓取光碟, ffmpeg用於視訊轉換, wrangler用於上傳到 Cloudflare。 Claude Code 負責執行命令——我主要負責描述我的需求並更換光碟。

第一步:對每張光碟進行安全備份。

克勞德·科德首先建議的是,在進行任何其他操作之前,先對每張光碟進行精確複製。這樣,即使光碟之後出現刮痕,我們也能擁有完全相同的數位副本。

解決這個問題需要用到ddrescue工具(而不是dd )。差別在於:如果光碟有刮痕或損壞區域, dd會直接失敗。 ddrescue 更ddrescue ——它會先複製一部分,然後再回溯並重試有問題的區域。

brew install ddrescue

Claude Code 在摸索過程中發現了一些 macOS 特有的陷阱。磁碟機不會像一般磁碟機一樣出現在diskutil list輸出中-你需要使用drutil status才能偵測到它。此外,ddrescue 需要知道磁碟的確切大小,否則它會認為有 9,223 PB 的資料需要讀取(幾乎是無限大)。磁碟大小來自drutil報告的區塊計數。

我們將所有步驟封裝成一個腳本,這樣我只需執行./rip.sh disc-01 ,等待大約 10 分鐘,更換光碟,然後重複操作即可。每張光碟都會產生一個約 4.3 GB 的.iso檔案——一個完美的克隆版本,我可以永久保存作為存檔。

第二步:轉換成可玩格式

掛載 ISO 鏡像後,你會發現一個名為VIDEO_TS資料夾,裡面全是.VOB檔。這是舊式的 DVD 視訊格式——DVD 播放器可以正常播放,但手機和瀏覽器就無法使用了。

ffmpeg將每個片段轉換為現代的 H.264 MP4 格式:

ffmpeg -i VTS_01_1.VOB \
  -c:v libx264 -crf 22 \
  -c:a aac -b:a 128k \
  -movflags +faststart \
  clip-01.mp4

我之前對這些參數一無所知——克勞德·科德幫我設定了這些參數,並解釋了每個參數的作用(例如, -movflags +faststart參數會將元資料移到文件開頭,這樣瀏覽器就可以直接播放而無需先下載整個文件)。我的光碟每張都有 13 到 21 個影片片段。

第三步:上線

你可以把這些影片上傳到 YouTube(設為不公開)、Google Drive 或 Dropbox,然後就萬事大吉了。但我更喜歡擁有自己的空間——文件儲存在我自己的掌控之中,網站簡潔易用,我可以隨意定制,而且沒有任何平台會壓縮我的影片或更改他們的分享功能。

Claude Code 在 Cloudflare 上設定了託管服務,事實證明,對於這個使用場景來說,Cloudflare 是免費的:

  • Cloudflare R2用於儲存視訊檔案。它採用物件儲存技術,就像雲端硬碟一樣。您可以使用命令列介面 (CLI) 命令上傳文件,文件就會一直儲存在雲端。

  • Cloudflare Pages託管一個簡單的網站-一個包含影片縮圖網格的 HTML 檔案。

  • 一個簡單的頁面功能將兩者連接起來,當您點擊播放時,它會從 R2 提供影片。

上傳過程就是一個循環,每個片段都使用wrangler r2 object put 。 Claude Code 負責處理命令,我則去做其他事情。

我在 Cloudflare 控制面板中唯一需要手動操作的步驟是將 R2 儲存桶連接到 Pages 網站。在專案的「設定」>「綁定」下,我新增了一個 R2 綁定,這樣網站程式碼就可以從儲存桶中讀取資料了。這大概花了 30 秒,但目前 CLI 還無法完成這項操作。

如果您想僅限家人存取,可以使用Cloudflare Access——只需加入需要存取權限人員的電子郵件地址,其他人就會看到登入介面。小規模群組也可以免費使用。

畫廊

網站本身就是一個單獨的 HTML 頁面。沒有 React,也沒有建置步驟。就是一個深色的縮圖網格。

克勞德·科德加入了一些不錯的點綴:

輕量級縮圖-頁面載入時,影片不再載入 47 個播放器,而是每個影片片段顯示一個帶有播放按鈕的小型 JPEG 縮圖(約 5 KB)。點擊縮圖即可載入實際影片。頁面載入速度不到一秒。

懸停預覽-將滑鼠懸停在任何縮圖上,即可像 YouTube 一樣快速瀏覽影片。這是透過精靈圖實現的——每個影片片段對應一張包含 20 幀水平平鋪圖像的圖片(每張約 40 KB)。只有在點擊播放按鈕後才會載入影片資料。

當你拖曳進度條時,每個縮圖底部都有一個小的進度條,這樣你就可以知道你在影片片段中的位置。

影片清單只是一個 JavaScript 物件,它將光碟名稱對應到影片片段數量。當我翻錄一張新光碟時,我只需加入一行程式碼並重新部署即可。

成本

基本上什麼都不用花。 Cloudflare R2 不收取頻寬費用-家人一起看影片時,不會按 GB 收費。儲存空間高達 10 GB 免費,而我那 3 張光碟的存檔大約有 8 GB 的轉換後影片。即使我把盒子裡所有的光碟都翻錄一遍,每月也遠低於 1 美元。對於一個偶爾重溫老家庭錄影的家庭來說,這套方案基本上是免費的。

撕裂腳本

這是我和 Claude Code 最終編寫的劇本。它可以自動偵測光碟,計算光碟大小,並執行兩次翻錄:

#!/usr/bin/env bash
set -euo pipefail

if [[ $# -lt 1 ]]; then
  echo "Usage: $0 <disc-label>"
  exit 1
fi

LABEL="$1"
RAW_DIR="$(dirname "$0")/raw"
LOG_DIR="$(dirname "$0")/logs"

DISC=$(drutil status 2>/dev/null | grep "Name:" | awk '{print $NF}')
if [[ -z "$DISC" ]]; then
  echo "No disc detected. Insert a disc and try again."
  exit 1
fi

BLOCKS=$(drutil status 2>/dev/null \
  | grep "Space Used:" \
  | sed 's/.*blocks:[[:space:]]*//' \
  | awk '{print $1}')
DISC_SIZE=$(( BLOCKS * 2048 ))

diskutil unmountDisk "$DISC" 2>/dev/null || true

ddrescue -b 2048 -s "$DISC_SIZE" -n "$DISC" "$RAW_DIR/${LABEL}.iso" "$LOG_DIR/${LABEL}.log"
ddrescue -b 2048 -s "$DISC_SIZE" -r 3 "$DISC" "$RAW_DIR/${LABEL}.iso" "$LOG_DIR/${LABEL}.log"

echo "Done! $(ls -lh "$RAW_DIR/${LABEL}.iso" | awk '{print $5}')"

放入光碟,執行./rip.sh disc-04 ,更換光碟,重複此操作。每張光碟大約需要 10 分鐘。


整個專案實際思考時間大約只花了一個小時,另外幾個小時用來等待光碟翻錄和影片上傳,期間我做了其他事情。 Claude Code 處理了我不了解的部分——ffmpeg 的參數、Cloudflare Pages 的視訊搜尋功能、精靈圖的計算——而我則負責它無法處理的部分:實際更換光碟。

現在我媽媽可以在手機上看以前的家庭錄影了。光這一點就值了。而且我知道這些家庭回憶安全地保存在雲端,我可以安心多了。


原文出處:https://dev.to/peter/converting-old-home-movie-dvds-into-a-private-streaming-site-5bmb


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝8   💬9   ❤️3
459
🥈
我愛JS
📝2   💬7   ❤️2
151
🥉
💬1  
4
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登