Kandungan
Bina video motion graphics dengan HTML dan Opus 5.5
Tulis beat sheet, minta Opus 5.5 menulis adegan HTML deterministik melalui Felo API, tangkap bingkai dengan Playwright dan encode MP4 dengan ffmpeg. Berjalan di WorkBuddy, ChatGPT dengan pelaksanaan kod, Codex, Pi Agent atau Claude Code.
Salin prompt
Ganti medan dalam kurungan siku lalu tampal ke Claude Code, Codex atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum kredit digunakan dan menjalankan aliran kerja.
Buat video [durasi] saat, format [menegak / mendatar], tentang [idea]. Gaya: [gaya]. Audiens: [audiens]. Audio: [tiada / trek berlesen di ./audio.mp3 / TTS]. Anda berjalan dalam folder dengan terminal dan [WorkBuddy / ChatGPT dengan pelaksanaan kod / Codex / Pi Agent / Claude Code]. Jika tidak boleh menjalankan Node dan pelayar headless, berhenti dan beritahu saya, jangan berpura-pura telah render. Ikut urutan ini: 1. Tulis storyboard 3–6 beat dengan saat mula dan tamat 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 minta saya melanggan Claude atau guna kunci Anthropic lain. 3. Minta Opus hasilkan satu fail HTML serba lengkap: set window.DURATION dan dedahkan async window.seek(t). Tiada aset luar, CDN, Date.now(), requestAnimationFrame(), peralihan CSS atau pemasa. Seed semua nilai rawak supaya t yang sama sentiasa melukis bingkai yang sama. 4. Pratonton pada t = 0, 25%, 50%, 75% dan bingkai terakhir. Semak limpahan, pemotongan, fon dan kawasan selamat sebelum render semua. 5. Render setiap bingkai dengan Playwright, encode H.264 dengan ffmpeg dan mux trek audio jika ada. 6. Tunjukkan bingkai pertama, terakhir dan laluan akhir. Jangan terbitkan. Peraturan: - Sebelum menggunakan kredit, tunjukkan panggilan Felo API dan anggaran token. - Gunakan hanya teks yang saya beri, atau label jelas teks placeholder yang direka. - Jangan guna bahan, muzik, logo atau fon berhak cipta. Hanya fon sistem dan bentuk yang dijana. - Pastikan video akhir bawah 30 saat, kecuali saya minta versi panjang. - Tulis semua ke ./video/ dan ringkaskan arahan yang dijalankan.
Salinan turut menyertakan langkah pemasangan dan peraturan keselamatan.
Apa yang anda dapat
Contoh output daripada satu larian. Bukan penjanaan langsung.
Laporan render
Adegan: video/scene.html (18 KB) Tempoh: 12 saat · 1080x1920 · 30fps · 360 bingkai Semakan: window.DURATION = 12 · seek(t) ada · tiada Date.now / rAF / pemasa
Pratonton: preview-0ms.png · preview-3000ms.png · preview-6000ms.png · preview-9000ms.png Pengekodan: video/video.mp4 (H.264, 360 bingkai) Audio: video/final.mp4 (AAC, 12.0 saat)
Panggilan sebenar
Untuk pembangun: aliran kerja sama sebagai kod, mengikut urutan pelaksanaan.
Tunjukkan panggilan API sebenar
Tulis beat sheet dahulu
Tetapkan tempoh dan 3–6 beat, setiap satu dengan mula, akhir, teks di skrin dan perubahan visual utama.
Bina adegan HTML dengan Opus 5.5
Halakan Anthropic SDK ke base URL Felo, guna
claude-opus-5-5dan minta HTML sahaja 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 output
scene.html: 18432 bytes
Semak determinisme dan pratonton
Tangkap skrinshot pada t=0, 25%, 50%, 75% dan bingkai akhir, semak teks melimpah, fon dan kawasan selamat.
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 output
duration 12s video/preview-0ms.png video/preview-3000ms.png video/preview-6000ms.png video/preview-9000ms.png
Render semua bingkai dan encode
Panggil
seek(t)dengant = frame / fps, tangkap bingkai 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 output
360 frames -> video/video.mp4
Mux audio dan tonton penuh
Tambah trek berlesen dengan
-c:v copy, semak tempoh dan kelantangan, lalu tonton dari awal hingga 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 output
12.000000
Iterasi dengan model sama
Terangkan hanya bingkai salah dan perubahan diingini, beri HTML semasa kepada Opus dan jalankan semula pratonton sebelum render penuh.
Termasuk
- Storyboard dan garis masa ditulis dahulu
- Adegan HTML deterministik dari Opus 5.5
- Skrip render Playwright dan pengekodan ffmpeg
- MP4 akhir dengan trek audio pilihan
- Gelung semakan dan pembetulan setiap bingkai
Apa yang tidak dilakukan
- Opus 5.5 menghasilkan kod, bukan bingkai; renderer pelayar menangkap bingkai
- Tiada langganan Claude, tetapi penggunaan model Felo dibilkan mengikut penggunaan
- Node, Playwright Chromium dan ffmpeg masih diperlukan
- Tiada aset luar atau CDN; hanya HTML/CSS/SVG/Canvas atau fail setempat
- Video panjang perlu pembahagian adegan; ini bukan rakaman skrin masa nyata
- Naratif dan muzik langkah berasingan; aliran hanya mux audio yang diberi
Soalan
Adakah Opus 5.5 terus membuat video?
Tidak. Ia menghasilkan teks dan kod dengan menulis adegan HTML; pelayar dan ffmpeg menukar adegan kepada bingkai dan MP4.
Perlu langganan Claude?
Tidak. Guna kunci Felo untuk memanggil `claude-opus-5-5` melalui Felo API dengan bil penggunaan; tiada langganan Claude berasingan.
Berjalan di ejen mana?
WorkBuddy, ChatGPT dengan pelaksanaan kod, Codex, Pi Agent, Claude Code atau ejen yang boleh menjalankan Node dan pelayar headless.
Kenapa seek(t)?
Penangkapan bingkai bukan masa nyata: bingkai 400 mungkin ditangkap jauh selepas 399, jadi setiap bingkai mesti fungsi tulen t.
Boleh guna HyperFrames atau Remotion?
Boleh untuk komposisi panjang atau projek berstruktur. Resipi ini menyimpan satu HTML supaya panggilan model dan gelung render mudah diperiksa.
Berapa kos video 12 saat?
Bergantung pada prompt, token output dan iterasi. Model Felo mengebil per token; semak harga sebelum render panjang.
Boleh guna muzik dan naratif sendiri?
Boleh jika ada hak. Render video dahulu, kemudian mux trek berlesen atau TTS dengan ffmpeg. Aliran tidak menghasilkan naratif.
Rujukan
Tutorial dan projek yang menjadi asas aliran kerja ini.
Aliran kerja berkaitan
Tukar halaman penyelidikan kepada pembentangan
Ekstrak halaman, simpan sebagai konteks LiveDoc, biar PPT Task API membina deck dan tanya sehingga pautan siap.
Buka aliran kerjaKandunganTukar brief produk kepada halaman pendaratan
Kaji audiens, simpan brief dalam LiveDoc, cipta tugas Landing Page dari konteks itu dan tanya sehingga halaman dihoskan siap.
Buka aliran kerjaKandunganIsi sebulan kandungan dengan soalan audiens anda
Petakan tema dengan Chat, cari soalan audiens di X, ambil sudut sebenar dari transkrip video dan susun kalendar empat minggu yang setiap baris menyebut buktinya.
Buka aliran kerjaSesuaikan
Resipi sama, disesuaikan dengan cara anda benar-benar menyampaikan.
Projek HyperFrames atau Remotion
Untuk komposisi panjang guna rangka kerja ini; panggilan model sama, hanya arahan render berubah.
Versi persegi untuk sosial
Kekalkan beat sheet, tukar ke 1080x1080 dan laraskan tipografi serta kawasan selamat.
Tiga varian dari satu brief
Jana tiga adegan dengan warna dan rentak berbeza, semak pratonton dan render yang terbaik sahaja.
Teruskan
Halaman rujukan di sebalik resipi ini dan langkah seterusnya.