
ff-tracking là một phim ngắn được tạo bằng mã, trong đó một camera ảo bám theo một tác nhân AI đang gõ lệnh trong terminal. Lớp phủ theo phong cách thị giác máy tính khóa vào từng ký tự riêng lẻ, trong khi phối cảnh, độ sâu trường ảnh, xử lý màu, bloom, nhiễu dòng quét, hạt và âm thanh đều được tạo bằng mã.
Dự án được xây dựng bằng Rust, fframes, Skia Metal, SkSL, FFmpeg và Python. Dự án kết xuất một video dài sáu giây qua hai lượt xử lý phối hợp, trong đó cả hiệu ứng hình ảnh và âm thanh đều được điều khiển bởi dữ liệu theo dõi dùng chung.
Dự án tạo ra gì
Bộ phim trình bày một chuỗi thông báo terminal như thinking…, reading 14 files, tool_call: render_frame() và ✓ 0 problems. Bộ theo dõi bám theo các ký tự mới nhất và hiển thị tọa độ pixel thực, khung mục tiêu, nhãn cùng các đường nối giữa những hộp.
- Tọa độ thực: nhãn của bộ theo dõi sử dụng vị trí thực tế của từng hộp trong khung hình đầu ra.
- Lấy nét chuyển động: mục tiêu độ sâu trường ảnh bám theo hộp được theo dõi khi tác nhân gõ.
- Theo dõi động: các đường nối liên kết những hộp theo thứ tự đọc, với một chấm di chuyển dọc theo mỗi đường.
- Hiệu ứng khóa: từ mới nhất chuyển sang màu đỏ trong hai khung hình, nhận hiệu ứng xé dòng quét và kích hoạt tiếng bíp được pan theo không gian.
- Nhiều phong cách: mười hai cảnh sử dụng các bảng màu Paper, Thermal, Mono, Phosphor, Amber, Navy và Neon.
- Thu gọn cuối: mười bốn hộp hợp thành một hộp, rồi biến thành một pill
Donetrước khi mờ dần về màu đen.
Tìm hiểu pipeline hai lượt xử lý
Dự án tách bố cục terminal khỏi các hiệu ứng camera và ống kính. Nhờ đó, vị trí của mọi ký tự luôn xác định được, đồng thời lượt xử lý thứ hai có thể coi terminal đã kết xuất như một đầu vào shader.
- Dữ liệu HUD: crate
hudđịnh nghĩa các cảnh, hộp theo dõi, chuyển động camera và dữ liệu phép chiếu. - Lượt phẳng: binary
flatkết xuất terminal dưới dạng SVG ở độ phân giải 3840×2160. Mỗi ký tự được đặt trong một phần tử<text>riêng để xác định chính xác vị trí. - Lượt ống kính: binary
lenslấy video phẳng làmiChannel0và áp dụng camera ảo cùng các hiệu ứng SkSL. - Lượt âm thanh:
tools/sfx.pyđọcout/tracks.jsonvà tổng hợp các sự kiện âm thanh khớp với thao tác gõ, chuyển cảnh, khóa và điểm hạ cuối. - Mã hóa: FFmpeg kết hợp video đã xử lý và âm thanh thành
out/tracking.mp4.
Shader ống kính xử lý phối cảnh, độ sâu trường ảnh, ánh xạ bảng màu, quang sai màu, bloom, lưới LED, hiệu ứng xé, hạt và lớp phủ theo dõi trong không gian camera. Hiệu ứng độ sâu trường ảnh sử dụng 36 mẫu theo góc vàng, trong khi các vùng sáng nhận trọng số theo phong cách bokeh.
Cài đặt các điều kiện tiên quyết
Việc kết xuất yêu cầu máy Mac dùng Apple silicon vì dự án sử dụng Skia trên Metal. Hãy cài đặt các công cụ sau trước khi build:
- Rust có hỗ trợ edition 2024
- FFmpeg
- Python 3
- Các gói Python
numpyvàscipy - Pillow và
img2webpnếu bạn muốn tạo lại media trong README
Clone repository và chuyển vào thư mục của repository:
git clone https://github.com/mrsarac/ff-tracking
cd ff-tracking
Kết xuất phim mặc định
Script chính build workspace Rust, xuất dữ liệu theo dõi, kết xuất lượt phẳng, tổng hợp âm thanh và kết xuất lượt ống kính:
tools/render.sh
Video hoàn chỉnh được ghi vào out/tracking.mp4. Trên máy M3 Pro, quá trình kết xuất mất khoảng 40 giây sau lần build đầu tiên.
Dữ liệu được tạo bao gồm out/tracks.json, mô tả các sự kiện theo dõi và điều khiển thiết kế âm thanh mặc định. Binary camera tùy chọn cũng ghi out/camera.json, chứa thông tin về độ zoom, độ nghiêng, góc lăn, vị trí hộp được theo dõi và tâm màn hình theo từng khung hình.
Kiểm tra khung hình, âm thanh và các giai đoạn shader
Vì mỗi lượt xử lý là một CLI fframes, bạn có thể kiểm tra đầu ra bằng các lệnh thông thường:
target/release/lens strip all -n 12
target/release/lens frame 81 -o frames
target/release/lens preview
target/release/lens audio analyze
Dùng strip để tạo contact sheet, frame để xuất một khung hình đầy đủ và preview để mở bản xem trước theo thời gian thực kèm âm thanh. Lệnh phân tích âm thanh báo cáo thông tin về độ lớn và true peak.
Để dừng shader sau một giai đoạn cụ thể, hãy đặt LENS_STAGE. Các giai đoạn được hỗ trợ được đánh số từ 0 đến 3:
LENS_STAGE=1 target/release/lens frame 81
Điều này hữu ích khi gỡ lỗi quá trình chuyển tiếp từ ảnh nguồn sang hiệu ứng ống kính cuối cùng.
Tùy chỉnh các cảnh
Mỗi cảnh là một mục trong SCENE_LIST bên trong hud/src/lib.rs. Một cảnh định nghĩa loại, văn bản, bảng màu, camera, vị trí bắt đầu và cỡ chữ:

SceneDef {
kind: Kind::Typing,
text: "thinking…",
palette: Palette::Thermal,
cam: cam(0.38, -0.22, 0.04, 2.5, 2.8, 50.0, 0.0, 1.2),
hero: (560.0, 540.0),
size: 104.0,
},
Thay đổi văn bản, chọn bảng màu khác hoặc điều chỉnh các giá trị camera, rồi kết xuất lại:
tools/render.sh
Bộ theo dõi, mục tiêu lấy nét, nhãn và các tiếng bíp khóa sẽ tự động tuân theo dữ liệu cảnh đã cập nhật. Các tên bảng màu hiện có gồm Paper, Thermal, Mono, Phosphor, Amber, Navy và Neon.
Chạy các bài kiểm thử HUD sau khi chỉnh sửa cảnh:
cargo test -p hud
Các bài kiểm thử này kiểm tra để mỗi dòng vừa trên màn hình và camera giữ mọi mục tiêu trong khung hình.
Sử dụng nhạc nền mặc định hoặc tùy chọn
Nhạc nền mặc định được tạo bởi tools/sfx.py. Nhạc kết hợp tiếng ù của màn hình, các hiệu ứng nhiễu bị giảm chất lượng bit khi chuyển cảnh, tiếng nhấp cho mỗi lần gõ phím và các tiếng bíp khóa theo thang ngũ cung được lia về phía hộp đang theo dõi. Nhạc cũng thêm hiệu ứng tăng dần cho đoạn thu gọn và tiếng chuông kèm âm trầm khi thẻ Done xuất hiện. Độ lớn được đo bằng ebur128 của FFmpeg và đặt ở mức -14 LUFS.
Kho lưu trữ cũng bao gồm bản nhạc Slab tối hơn tùy chọn ở 120 BPM. Bản nhạc sử dụng cùng dữ liệu theo dõi và camera, vì vậy các âm báo khóa, tiếng gõ phím, lớp đệm, hiệu ứng tăng dần, nhiễu, bộ lọc âm trầm và các đoạn xé âm trầm đều phản hồi theo chuyển động hoạt ảnh.
Sử dụng bản kết xuất nhạc đã được commit bằng lệnh:
tools/score.sh
Để kết xuất lại bản nhạc, hãy cung cấp một bản Slab checkout được xây dựng bằng zig build -Doptimize=ReleaseFast:
SLAB=/path/to/slab tools/score.sh
Tập lệnh bản nhạc ghi score/ff_tracking.slab, còn âm thanh đã kết xuất có tại score/score.wav. Quy trình bản nhạc kéo dài ra ngoài hình ảnh để dành chỗ cho phần vang đuôi, sau đó cắt kết quả xuống sáu giây và làm mờ dần cùng video.
Lưu ý rằng score/score.py nhập slabkit, được phân phối cùng Slab theo giấy phép GPL-3.0. Chỉ cần Slab để kết xuất lại bản nhạc; các tệp bản nhạc đã commit được cung cấp theo giấy phép MIT của kho lưu trữ, như README nêu rõ.
Tạo lại media tài liệu
Kho lưu trữ bao gồm một tập lệnh để tạo lại các hình ảnh README. Chạy tập lệnh bằng Python sau khi cài đặt các phần phụ thuộc xử lý hình ảnh:
python3 -I tools/readme_media.py
Bố cục dự án
hud/: cảnh, hộp theo dõi, dữ liệu camera và logic phép chiếu.flat/: lượt kết xuất terminal đầu tiên ở độ phân giải 3840×2160.lens/: lượt kết xuất thứ hai, bao gồmlens/shaders/lens.skslvà bộ theo dõi trong không gian camera.tools/: tập lệnh kết xuất chính, trình tạo âm thanh, trình tạo media README và quy trình Slab.score/: bản nhạc Slab tùy chọn, dự án và tệp WAV đã kết xuất.docs/: đặc tả thiết kế, lời nhắc, quyết định và các đóng góp cho fframes.
Ghi chú triển khai nâng cao
Thiết kế hai lượt kết xuất rất quan trọng vì shader hiện chưa thể lấy mẫu một cây con SVG từ cùng khung hình. Thay vào đó, khung hình phẳng đã hoàn tất được đồng bộ hóa và truyền cho shader dưới dạng đầu vào hình ảnh:
.image("iChannel0", &frame.get_synced_video_frame(..)?.into_image())
README cũng ghi lại một số ràng buộc thực tế:
flatđược dành riêng trong SkSL, vì vậy tránh dùng từ này làm tên hàm trợ giúp.- Ở cấp
Video, hãy trả về một<svg>gốc thay vìSvgr::empty(); một phần tử gốc rỗng có thể gây ra lỗi kết xuất muộn. - Hàm phép chiếu CPU
hud::projectgiữ lớp phủ bộ theo dõi thẳng hàng với camera của shader. - Cả hai lượt xử lý hình ảnh và trình tạo âm thanh đều đọc cùng thông tin theo dõi HUD, ngăn tiêu điểm và các sự kiện âm thanh lệch khỏi các glyph.
Kết luận
ff-tracking minh họa cách tạo hoàn toàn một chuỗi điện ảnh ngắn từ dữ liệu cảnh có cấu trúc, SVG, Rust, SkSL, kết xuất GPU và âm thanh tổng hợp. Hãy bắt đầu với tools/render.sh, kiểm tra các khung hình trung gian, rồi chỉnh sửa SCENE_LIST để tạo thông điệp terminal, bảng màu, chuyển động camera và bố cục được theo dõi của riêng bạn. Sử dụng quy trình Slab tùy chọn khi bạn muốn một bản nhạc tuân theo cùng nhịp thời gian và chuyển động camera.
