Viewrium Docs
Guides

Generate from video

Turn a product video into catalog images and a GLB model with video_url.

Pass a video_url and Viewrium extracts frames, selects the most useful ones, and works from them exactly as it would from stills. This is handy when you have a turntable or walk-around clip instead of photographs.

Ask for the quote

Python
from viewrium import ModelDimensions, ProductCreateRequest, ProductDraft, ProductOrder, Viewrium

client = Viewrium("sk_live_...")

parked = client.products.create(
    ProductCreateRequest(
        video_url="https://cdn.example.com/sofa-360.mp4",
        draft=ProductDraft(
            title="Linen 3-seat sofa",
            dimensions=ModelDimensions(height=85, width=220, depth=95),  # cm
        ),
        order=ProductOrder(images=True, model=True),
    )
)
print(parked.cost.total_credits, parked.model.allowed)
TypeScript
import { Viewrium } from "@viewrium/sdk";

const client = new Viewrium({ apiKey: "sk_live_..." });

const parked = await client.products.create({
  video_url: "https://cdn.example.com/sofa-360.mp4",
  draft: {
    title: "Linen 3-seat sofa",
    dimensions: { height: 85, width: 220, depth: 95 }, // cm
  },
  order: { images: true, model: true },
});

Tips for good results

  • Orbit the product. A slow 360-degree pass that keeps the whole item in frame gives frame selection the coverage it needs - and coverage is what keeps viewpoints out of model.unseen_views.
  • Steady and well-lit clips beat shaky, dark ones - the selected frames are only as good as the video.
  • Host a direct video URL (for example .mp4) that Viewrium can fetch.

Then

As with every source, the quote parks: post resume_token back through products.create to commit, which returns the product at display_status: "generating". Wait for it to settle by polling or webhooks, then read product.model.glb_url and product.images.

Python
product = client.products.create(ProductCreateRequest(resume_token=parked.resume_token))
TypeScript
if (parked.status !== "parked") throw new Error("unexpected: already committed");
const product = await client.products.create({ resume_token: parked.resume_token });

On this page