Konten
Buat video motion graphics dengan HTML dan Opus 5.5
Tulis beat sheet, minta Opus 5.5 menulis adegan HTML deterministik lewat Felo API, tangkap frame dengan Playwright, dan encode MP4 dengan ffmpeg. Berjalan di WorkBuddy, ChatGPT dengan eksekusi kode, Codex, Pi Agent, atau Claude Code.
Salin prompt
Ganti kolom dalam kurung siku lalu tempel ke Claude Code, Codex, atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum memakai kredit, dan menjalankan alur kerja.
Buat video [durasi] detik, format [vertikal / horizontal], tentang [ide]. Gaya: [gaya]. Audiens: [audiens]. Audio: [tanpa / trek berlisensi di ./audio.mp3 / TTS]. Kamu berjalan di folder dengan terminal dan [WorkBuddy / ChatGPT dengan eksekusi kode / Codex / Pi Agent / Claude Code]. Jika tidak bisa menjalankan Node dan browser headless, berhenti dan beri tahu saya, jangan berpura-pura sudah merender. Ikuti urutan ini: 1. Tulis storyboard 3–6 beat dengan detik mulai dan selesai yang tepat. 2. Langkah HTML: panggil Claude Opus 5.5 melalui Felo API. Gunakan ID model claude-opus-5-5 dan FELO_API_KEY saya. Jangan meminta langganan Claude atau kunci Anthropic lain kepada saya. 3. Minta Opus membuat satu berkas HTML mandiri: setel window.DURATION dan ekspos async window.seek(t). Tanpa aset eksternal, CDN, Date.now(), requestAnimationFrame(), transisi CSS, atau timer. Beri seed semua nilai acak agar t yang sama selalu menggambar frame yang sama. 4. Pratinjau pada t = 0, 25%, 50%, 75%, dan frame terakhir. Periksa overflow, pemotongan, font, dan area aman sebelum merender semua. 5. Render setiap frame dengan Playwright, encode H.264 dengan ffmpeg, dan mux trek audio jika ada. 6. Tampilkan frame pertama, terakhir, dan path akhir. Jangan menerbitkan. Aturan: - Sebelum memakai kredit, tampilkan panggilan Felo API dan perkiraan token. - Gunakan hanya teks yang saya berikan, atau tandai jelas teks placeholder yang dikarang. - Jangan memakai materi, musik, logo, atau font berhak cipta. Hanya font sistem dan bentuk yang dihasilkan. - Jaga video akhir di bawah 30 detik, kecuali saya meminta versi panjang. - Tulis semuanya ke ./video/ dan ringkas perintah yang dijalankan.
Salinan juga menyertakan langkah pemasangan dan aturan keamanan.
Yang Anda dapatkan
Contoh keluaran dari satu eksekusi. Bukan pembuatan langsung.
Laporan render
Adegan: video/scene.html (18 KB) Durasi: 12 detik · 1080x1920 · 30 fps · 360 frame Pemeriksaan: window.DURATION = 12 · seek(t) ada · tanpa Date.now / rAF / timer
Pratinjau: preview-0ms.png · preview-3000ms.png · preview-6000ms.png · preview-9000ms.png Encoding: video/video.mp4 (H.264, 360 frame) Audio: video/final.mp4 (AAC, 12,0 detik)
Panggilan persisnya
Untuk developer: alur kerja yang sama sebagai kode, sesuai urutan eksekusi.
Tampilkan panggilan API asli
Tulis beat sheet dulu
Tetapkan durasi dan 3–6 beat, masing-masing dengan awal, akhir, teks di layar, dan perubahan visual utama.
Buat adegan HTML dengan Opus 5.5
Arahkan Anthropic SDK ke base URL Felo, pakai
claude-opus-5-5, dan minta hanya HTML denganwindow.DURATIONdanasync seek(t).generate-scene.ts import { mkdir, writeFile } from "node:fs/promises"; import Anthropic from "@anthropic-ai/sdk"; const SYSTEM = `You write a single, self-contained HTML video scene. Requirements: - 1080x1920 (or 1920x1080), no external assets, system fonts only. - set window.DURATION = <seconds>. - expose async window.seek(t) that draws the frame for time t. - no Date.now(), no requestAnimationFrame(), no CSS transitions, no timers. - seed every random value; the same t must always produce the same frame. - return only the HTML file, no markdown fences.`; const brief = `12-second vertical motion graphic about [idea]. Beats: [0-3s hook], [3-7s point], [7-10s proof], [10-12s CTA]. Palette: [colors]. Type: system sans. Keep text inside a 64px safe area.`; const anthropic = new Anthropic({ apiKey: process.env.FELO_API_KEY, baseURL: "https://openapi.felo.ai/api", }); const message = await anthropic.messages.create({ model: "claude-opus-5-5", max_tokens: 32000, system: SYSTEM, messages: [{ role: "user", content: brief }], }); const raw = message.content .filter((block) => block.type === "text") .map((block) => block.text) .join(""); const html = raw.replace(/^```(?:html)?\s*/i, "").replace(/```\s*$/, "").trim(); await mkdir("video", { recursive: true }); await writeFile("video/scene.html", html); console.log(`scene.html: ${html.length} bytes`);Contoh keluaran
scene.html: 18432 bytes
Periksa determinisme dan pratinjau
Ambil screenshot di t=0, 25%, 50%, 75% dan frame terakhir, periksa luapan teks, font, dan area aman.
preview.ts import { chromium } from "playwright"; import { pathToFileURL } from "node:url"; const browser = await chromium.launch(); const page = await browser.newPage({ viewport: { width: 1080, height: 1920 }, deviceScaleFactor: 1, }); await page.goto(pathToFileURL("video/scene.html").href); await page.waitForFunction(() => typeof (window as any).seek === "function"); const duration = await page.evaluate(() => (window as any).DURATION as number); for (const t of [0, duration * 0.25, duration * 0.5, duration * 0.75]) { await page.evaluate(async (time) => { await (window as any).seek(time); }, t); await page.screenshot({ path: `video/preview-${Math.round(t * 1000)}ms.png` }); } await browser.close(); console.log(`duration ${duration}s`);Contoh keluaran
duration 12s video/preview-0ms.png video/preview-3000ms.png video/preview-6000ms.png video/preview-9000ms.png
Render semua frame dan encode
Panggil
seek(t)dengant = frame / fps, tangkap frame, dan encode H.264 dengan ffmpeg.render.ts import { spawn } from "node:child_process"; import { mkdir, rm } from "node:fs/promises"; import { pathToFileURL } from "node:url"; import { chromium } from "playwright"; const FPS = 30; const browser = await chromium.launch(); const page = await browser.newPage({ viewport: { width: 1080, height: 1920 }, deviceScaleFactor: 1, }); await page.goto(pathToFileURL("video/scene.html").href); await page.waitForFunction(() => typeof (window as any).seek === "function"); const duration = await page.evaluate(() => (window as any).DURATION as number); const frames = Math.ceil(duration * FPS); await rm("video/frames", { recursive: true, force: true }); await mkdir("video/frames", { recursive: true }); for (let frame = 0; frame < frames; frame++) { await page.evaluate(async (time) => { await (window as any).seek(time); }, frame / FPS); await page.screenshot({ path: `video/frames/${String(frame).padStart(5, "0")}.png`, }); } await browser.close(); const ffmpeg = spawn("ffmpeg", [ "-y", "-framerate", String(FPS), "-i", "video/frames/%05d.png", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-movflags", "+faststart", "video/video.mp4", ], { stdio: "inherit" }); await new Promise<void>((resolve, reject) => { ffmpeg.on("exit", (code) => { if (code === 0) resolve(); else reject(new Error(`ffmpeg exited with ${code}`)); }); }); console.log(`${frames} frames -> video/video.mp4`);Contoh keluaran
360 frames -> video/video.mp4
Mux audio dan tonton penuh
Tambahkan track berlisensi dengan
-c:v copy, periksa durasi dan volume, lalu tonton dari awal sampai akhir.mux.sh ffmpeg -i video/video.mp4 -i video/audio.wav \ -c:v copy -c:a aac -b:a 192k -shortest \ video/final.mp4 ffprobe -v error -show_entries format=duration \ -of default=nw=1:nk=1 video/final.mp4Contoh keluaran
12.000000
Iterasi dengan model yang sama
Jelaskan hanya frame salah dan perubahan yang diinginkan, berikan HTML saat ini ke Opus, jalankan ulang pratinjau sebelum render penuh.
Termasuk
- Storyboard dan timeline yang ditulis dulu
- Adegan HTML deterministik dari Opus 5.5
- Skrip render Playwright dan encoding ffmpeg
- MP4 final dengan track audio opsional
- Loop tinjauan dan koreksi per frame
Yang tidak dilakukan
- Opus 5.5 menghasilkan kode, bukan frame; renderer browser menangkap frame
- Tanpa langganan Claude, tetapi pemakaian model Felo ditagih sesuai pemakaian
- Node, Playwright Chromium, dan ffmpeg tetap diperlukan
- Tanpa aset eksternal atau CDN; hanya HTML/CSS/SVG/Canvas atau file lokal
- Video panjang butuh pembagian adegan; ini bukan rekaman layar real-time
- Narasi dan musik langkah terpisah; alur hanya mux audio yang disediakan
Pertanyaan
Apakah Opus 5.5 langsung membuat video?
Tidak. Ia menghasilkan teks dan kode dengan menulis adegan HTML; browser dan ffmpeg mengubah adegan menjadi frame dan MP4.
Perlu langganan Claude?
Tidak. Pakai kunci Felo untuk memanggil `claude-opus-5-5` lewat Felo API dengan tagihan pemakaian; tanpa langganan Claude terpisah.
Berjalan di agent mana?
WorkBuddy, ChatGPT dengan eksekusi kode, Codex, Pi Agent, Claude Code, atau agent yang bisa menjalankan Node dan browser headless.
Mengapa seek(t)?
Penangkapan frame tidak real-time: frame 400 bisa ditangkap jauh setelah 399, jadi setiap frame harus fungsi murni dari t.
Bisa pakai HyperFrames atau Remotion?
Bisa, untuk komposisi panjang atau proyek terstruktur. Resep ini menyimpan satu HTML agar panggilan model dan loop render mudah diperiksa.
Berapa biaya video 12 detik?
Tergantung prompt, token keluaran, dan iterasi. Model Felo menagih per token; cek harga sebelum render panjang.
Bisa pakai musik dan narasi sendiri?
Bisa, jika punya hak. Render dulu, lalu mux track berlisensi atau TTS dengan ffmpeg. Alur tidak membuat narasi.
Referensi
Tutorial dan proyek yang mendasari alur kerja ini.
Alur kerja terkait
Ubah halaman riset menjadi presentasi
Ekstrak halaman, simpan sebagai konteks LiveDoc, biarkan PPT Task API membangun deck, dan tanyakan sampai tautan selesai.
Buka alur kerjaKontenUbah brief produk menjadi landing page
Riset audiens, simpan brief di LiveDoc, buat tugas Landing Page dari konteks itu, dan tanyakan sampai halaman yang dihosting siap.
Buka alur kerjaKontenIsi satu bulan konten dengan pertanyaan audiens Anda
Petakan tema dengan Chat, temukan pertanyaan audiens di X, ambil sudut nyata dari transkrip video, dan susun kalender empat minggu di mana setiap baris menyebut buktinya.
Buka alur kerjaSesuaikan
Resep yang sama, disesuaikan dengan cara Anda benar-benar mengirim.
Proyek HyperFrames atau Remotion
Untuk komposisi panjang pakai framework ini; panggilan model sama, hanya perintah render berubah.
Versi persegi untuk sosial
Pertahankan beat sheet, ubah ke 1080x1080, sesuaikan tipografi dan area aman.
Tiga varian dari satu brief
Buat tiga adegan dengan warna dan ritme berbeda, tinjau pratinjau, render yang terbaik saja.
Lanjut
Halaman referensi di balik resep ini dan langkah berikutnya.