
Chuyển đổi DVD phim gia đình cũ thành một trang web phát trực tuyến riêng tư
Converting old home movie DVDs into a private streaming site
SKIP
Một người họ hàng đã gửi cho tôi một vài đĩa DVD chứa các video gia đình thực sự cũ đã có lúc được lưu vào đĩa DVD. Vấn đề là, tôi không sở hữu đầu DVD và hầu hết mọi người vào năm 2026 cũng vậy. Những chiếc đĩa này chỉ...
Một người họ hàng đã gửi cho tôi một vài DVD chứa video gia đình thực sự cũ đã có lúc được lưu vào DVD. Vấn đề là tôi không sở hữu đầu DVD và hầu hết mọi người ở năm 2026 cũng vậy. Những chiếc đĩa này chỉ nằm trong hộp, dần dần không thể phát được, lưu giữ những kỷ niệm mà không ai thực sự có thể xem được (thật đáng tiếc).
Vì vậy, tôi đã mua một ổ USB DVD giá rẻ trên Amazon (~$25, một chiếc Amicool A11) và nghĩ rằng mình sẽ sao chép các đĩa và đặt video ở nơi nào đó mà gia đình tôi có thể lấy được. Tại thời điểm này, tôi là một lập trình viên rung cảm nên tôi đã sử dụng Claude Code và tập hợp một quy trình làm việc để sao chép đĩa và tải video lên trang web phát trực tuyến riêng tư mà cả gia đình tôi có thể xem trên điện thoại của họ.
Đây là cách chúng tôi đã thực hiện.
Những gì bạn cần
Về mặt phần mềm, mọi thứ đều là công cụ CLI miễn phí được cài đặt qua Homebrew: ddrescue để sao chép, ffmpeg để chuyển đổi video và wrangler để tải lên Cloudflare. Claude Code xử lý các lệnh — tôi chủ yếu mô tả những gì tôi muốn và đổi đĩa.
Bước một: tạo một bản sao an toàn cho mỗi đĩa
Điều đầu tiên Claude Code đề xuất là tạo một bản sao hoàn hảo cho mỗi đĩa trước khi làm bất cứ điều gì khác. Bằng cách đó, ngay cả khi đĩa bị trầy xước sau này, chúng tôi vẫn có bản sao kỹ thuật số chính xác.
Công cụ thực hiện việc này là ddrescue (không phải dd). Điểm khác biệt: nếu đĩa có vết xước hoặc vết xấu thì dd chỉ bị lỗi. ddrescue thông minh hơn — nó sao chép những gì có thể, sau đó quay lại và thử lại các vùng có vấn đề.
brew install ddrescue
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Có một số vấn đề dành riêng cho macOS mà Claude Code đã tìm ra trong quá trình thực hiện. Ổ đĩa không hiển thị trong diskutil list giống như ổ đĩa bình thường — bạn cần drutil status để phát hiện ổ đĩa đó. Và ddrescue cần được cho biết kích thước đĩa chính xác, nếu không nó sẽ cho rằng có 9.223 petabyte dữ liệu để đọc (về cơ bản là vô tận). Kích thước xuất phát từ số lượng khối mà drutil báo cáo.
Chúng tôi gói tất cả những điều này vào một tập lệnh để tôi có thể chạy ./rip.sh disc-01, đợi khoảng 10 phút, đổi đĩa và lặp lại. Mỗi đĩa tạo ra một tệp .iso ~ 4,3 GB — một bản sao hoàn hảo mà tôi có thể giữ mãi mãi dưới dạng kho lưu trữ.
Bước hai: chuyển đổi sang thứ gì đó có thể chơi được
Gắn ISO và bạn tìm thấy thư mục VIDEO_TS chứa đầy các tệp .VOB. Đó là định dạng DVD-Video cũ — phù hợp với đầu DVD nhưng vô dụng đối với điện thoại và trình duyệt.
ffmpeg chuyển đổi từng clip thành MP4 H.264 hiện đại:
ffmpeg -i VTS_01_1.VOB \
-c:v libx264 -crf 22 \
-c:a aac -b:a 128k \
-movflags +bắt đầu nhanh \
clip-01.mp4
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tôi không biết bất kỳ cờ nào trong số này — Claude Code đã chọn cài đặt và giải thích lý do tại sao mỗi cờ lại quan trọng (-movflags +faststart sẽ di chuyển siêu dữ liệu lên phía trước tệp để trình duyệt có thể phát trực tuyến mà không cần tải xuống toàn bộ nội dung trước). Đĩa của tôi có từ 13 đến 21 clip mỗi đĩa.
Bước ba: đưa nó lên mạng
Bạn có thể tải những nội dung này lên YouTube (không công khai), Google Drive hoặc Dropbox và kết thúc một ngày. Nhưng tôi thích ý tưởng có thứ của riêng mình — các tệp trên bộ lưu trữ do tôi kiểm soát, một trang web đơn giản mà tôi có thể tùy chỉnh, không có nền tảng nào quyết định nén video của tôi hay thay đổi tính năng chia sẻ của chúng.
Claude Code đã thiết lập dịch vụ lưu trữ trên Cloudflare, dịch vụ này hóa ra lại miễn phí cho trường hợp sử dụng này:
- Cloudflare R2 lưu trữ các tệp video. Đó là lưu trữ đối tượng, giống như ổ cứng trên đám mây. Bạn tải tệp lên bằng lệnh CLI và chúng chỉ ở đó.
- Trang Cloudflare lưu trữ một trang web đơn giản — một tệp HTML có lưới các hình thu nhỏ video.
- Một Chức năng trang nhỏ kết nối cả hai, cung cấp video từ R2 khi bạn nhấp vào phát.
Quá trình tải lên chỉ là một vòng lặp chạy wrangler r2 object put cho mỗi vòng lặp clip. Claude Code xử lý các lệnh trong khi tôi làm những việc khác.
Một bước tôi phải thực hiện thủ công trong bảng điều khiển Cloudflare là kết nối nhóm R2 với trang Trang. Trong Ràng buộc Cài đặt > của dự án, tôi đã thêm ràng buộc R2 để mã của trang web thực sự có thể đọc được từ nhóm. Mất khoảng 30 giây nhưng đó vẫn chưa phải là điều CLI có thể làm được.
Để chỉ khóa nó cho gia đình, có Truy cập Cloudflare — bạn thêm địa chỉ email của những người lẽ ra phải có quyền truy cập và những người khác sẽ nhận được màn hình đăng nhập. Cũng miễn phí cho các nhóm nhỏ.
Phòng trưng bày
Bản thân trang web này là một trang HTML duy nhất. Không có React, không có bước xây dựng. Chỉ là một lưới hình thu nhỏ tối màu.
Claude Code đã thêm một số chi tiết thú vị:
Hình thu nhỏ nhẹ — thay vì tải 47 trình phát video khi tải trang, mỗi clip hiển thị một hình thu nhỏ JPEG nhỏ (~5 KB) cùng với một nút phát. Nhấp vào nó và tải video thực tế. Trang tải trong chưa đầy một giây.
Xem trước khi di chuột — di chuyển chuột qua bất kỳ hình thu nhỏ nào và lướt qua video theo phong cách YouTube. Điều này được thực hiện với các trang sprite - một hình ảnh trên mỗi clip chứa 20 khung hình được xếp theo chiều ngang (mỗi khung hình ~ 40 KB). Không tải dữ liệu video cho đến khi bạn thực sự nhấp vào phát.
Có một thanh tiến trình nhỏ ở cuối mỗi hình thu nhỏ khi bạn xem qua để có thể biết mình đang ở đâu trong clip.
Tệp kê khai video chỉ là một đối tượng JavaScript ánh xạ tên đĩa theo số lượng clip. Khi tôi trích xuất một đĩa mới, tôi thêm một dòng và triển khai lại.
Chi phí bao nhiêu
Về cơ bản là không có gì. Cloudflare R2 không tính phí băng thông — khi gia đình phát trực tuyến video, bạn sẽ không bị tính phí theo GB. Bộ nhớ miễn phí lên tới 10 GB và kho lưu trữ 3 đĩa của tôi có khoảng 8 GB video được chuyển đổi. Ngay cả khi tôi rip mọi đĩa trong hộp thì tôi cũng chỉ kiếm được dưới 1 USD/tháng. Đối với một gia đình tình cờ xem lại các video cũ ở nhà thì đây về cơ bản là một thiết lập miễn phí.
Kịch bản rip
Đây là kịch bản Claude Code và tôi đã viết xong. Nó tự động phát hiện đĩa, tìm ra kích thước và chạy rip hai lần:
#!/usr/bin/env bash
set -euo lỗi đường ống
if [[ $# -lt 1 ]]; thì
tiếng vang "Cách sử dụng: $0 <nhãn đĩa>"
thoát 1
fi
LABEL="$1"
RAW_DIR="$(dirname "$0")/thô"
LOG_DIR="$(dirname "$0")/logs"
DISC=$(drutil status 2>/dev/null | grep "Tên:" | awk '{print $NF}')
nếu [[ -z "$DISC" ]]; thì
echo "Không phát hiện thấy đĩa nào. Hãy lắp đĩa vào và thử lại."
thoát 1
fi
BLOCKS=$(drutil status 2>/dev/null \
| grep "Dung lượng đã sử dụng:" \
| sed 's/.*blocks:[[:space:]]*//' \
| awk '{print $1}')
DISC_SIZE=$(( KHỐI * 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 "Xong! $(ls -lh "$RAW_DIR/$ {LABEL.iso" ôi
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Đưa đĩa vào, chạy ./rip.sh disc-04, hoán đổi, lặp lại. Khoảng 10 phút mỗi đĩa.
Toàn bộ dự án mất khoảng một giờ để suy nghĩ thực tế và vài giờ chờ đợi đĩa được trích xuất và tải video lên trong khi tôi làm những việc khác. Claude Code đã xử lý những phần mà tôi không biết — cờ ffmpeg, Chức năng trang Cloudflare để tìm kiếm video, phép toán bảng sprite — và tôi đã xử lý phần mà nó không thể: hoán đổi đĩa vật lý.
Mẹ tôi hiện có thể xem các video cũ về nhà của bà trên điện thoại. Chỉ điều đó thôi đã đáng giá rồi. Và tôi có thể yên tâm khi biết những kỷ niệm gia đình này được lưu trữ an toàn trên đám mây.
Tác giả: Peter Kim Frank