Botverse Conform
Mux a separate video file and audio file into one fresh-encoded output, reconciling frame-rate or duration mismatches — or splice video and image segments together for slates, bumpers, end cards, and joined clips.
What "conform" means here
A conform is what a post-production pipeline calls the step where a picture track and a separately-sourced audio track get combined into one deliverable — and where any mismatch between the two (frame rate, or plain length) gets reconciled before the two are locked together. Common cases: a video exported at one frame rate needs to marry up with audio recorded or mixed separately; a translated or re-recorded audio track is longer or shorter than the picture it belongs to; footage shot at 24fps needs to play back at 25fps (or vice versa) for a different delivery spec, with the audio's pitch and pace following it.
Botverse Conform does this as a single MCP call. Point it at a video and an audio source, pick how frame-rate and duration differences should be resolved, and get back one fresh-encoded file.
Conform methods
target_framerate is required for every method except mux. For speed_conform, Botverse detects the source video's actual frame rate automatically — you only supply the target.Duration policy
Independently of the frame-rate method, the two sources might just be different lengths — a dubbed audio track that runs long, or a trimmed video that's shorter than its original audio. options.duration_policy decides what happens:
Splice: slates, bumpers, end cards, and joining clips
A second conform operation, alongside the video+audio mux above: conform_splice_from_url and conform_splice_media concatenate an ordered list of video and/or still-image segments into one continuous, fresh-encoded output. Where you put an image segment decides what it reads as — the mechanism underneath is identical either way:
Every segment is scaled to fit the output frame and letterboxed — not stretched — if its aspect ratio differs, so a portrait or square slate against widescreen footage doesn't distort. Any segment without its own audio (every still image, or an occasional silent video clip) gets a matching silent track synthesised automatically, so the output's audio never drops out mid-timeline. At least one segment must be a video — its resolution and frame rate become the output's defaults unless options.width/height/framerate override them. 2–8 segments per job.
Tools
conform_from_urlFetch a video file and an audio file from public HTTPS URLs (or cloud share links) and mux them into one output — no upload step required. Use this when both sources are already hosted online.
| Name | Type | Req | Description |
|---|---|---|---|
| video_url | string | yes | Public HTTPS URL of the video source. Its frames and resolution drive the output. Share links from Dropbox, Google Drive, OneDrive, SharePoint, Box auto-resolve. |
| audio_url | string | yes | Public HTTPS URL of the audio source. Replaces/supplies the video's audio track. |
| output_format | string | yes | One of: mp4, webm, mov_prores. |
| options.method | string | no | mux (default) | resample_video | interpolate_video | speed_conform. |
| options.target_framerate | number | no | Target video frame rate. Required for every method except mux. |
| options.duration_policy | string | no | shortest (default) | match_video. |
| options.width / height | number | no | Resize output. Single dimension scales proportionally. |
| options.bitrate | string | no | Video bitrate override, e.g. '2M'. |
| options.audio_bitrate | string | no | Audio bitrate, e.g. '128k'. |
| options.h264_profile | string | no | baseline | main | high — mp4 output only. |
| Field | Type | Description |
|---|---|---|
| job_id | string | Unique job identifier. Poll get_job_status with this. |
| status | string | "pending" on success. |
| estimated_cost_usd | number | Pre-flight cost estimate. |
conform_mediaMux an already-uploaded video and audio file (both from get_upload_url) into one output. Use for local files, or files too large to fetch by URL.
| Name | Type | Req | Description |
|---|---|---|---|
| video_object_key | string | yes | S3 object key from get_upload_url for the video source. |
| audio_object_key | string | yes | S3 object key from get_upload_url for the audio source. |
| output_format | string | yes | One of: mp4, webm, mov_prores. |
| options | object | no | Same fields as conform_from_url.options. |
| Field | Type | Description |
|---|---|---|
| job_id | string | Unique job identifier. Use for polling and download. |
| status | string | "pending" on success. |
conform_splice_from_urlConcatenate an ordered list of video and/or still-image segments (all public HTTPS URLs) into one continuous, fresh-encoded output — head/tail slates, bumpers, end cards, mid-roll inserts, or joining real clips back-to-back.
| Name | Type | Req | Description |
|---|---|---|---|
| segments | array | yes | Ordered list of {type: 'video', url} or {type: 'image', url, duration_seconds}. 2–8 entries; at least one type 'video'. |
| output_format | string | yes | One of: mp4, webm, mov_prores. |
| options.width / height / framerate | number | no | Defaults to the first video segment's own values. |
| options.bitrate | string | no | Video bitrate override, e.g. '2M'. |
| options.audio_bitrate | string | no | Audio bitrate, e.g. '128k'. |
| options.h264_profile | string | no | baseline | main | high — mp4 output only. |
| Field | Type | Description |
|---|---|---|
| job_id | string | Unique job identifier. Poll get_job_status with this. |
| status | string | "pending" on success. |
| estimated_cost_usd | number | Pre-flight cost estimate. |
conform_splice_mediaSame as conform_splice_from_url, using already-uploaded segments (each from get_upload_url) instead of public URLs. Use for local files, or files too large to fetch by URL.
| Name | Type | Req | Description |
|---|---|---|---|
| segments | array | yes | Ordered list of {type: 'video', object_key} or {type: 'image', object_key, duration_seconds}. 2–8 entries; at least one type 'video'. |
| output_format | string | yes | One of: mp4, webm, mov_prores. |
| options | object | no | Same fields as conform_splice_from_url.options. |
| Field | Type | Description |
|---|---|---|
| job_id | string | Unique job identifier. Use for polling and download. |
| status | string | "pending" on success. |
Example — combine a picture and a replacement audio track
The simplest conform: video and audio are already at the same frame rate and the same length, and you just need them muxed into one deliverable.
// Agent calls:
{
"name": "conform_from_url",
"arguments": {
"video_url": "https://cdn.example.com/footage/scene-04-picture.mp4",
"audio_url": "https://cdn.example.com/footage/scene-04-remix.wav",
"output_format": "mp4"
}
}
// Botverse returns:
{
"job_id": "job_9a1c2f4e",
"status": "pending",
"estimated_cost_usd": 0.30
}Example — reconcile a frame-rate mismatch
Picture was delivered at 30fps; the target spec needs 24fps, and dropping every fifth frame would judder too much on this footage. Use interpolate_video for a motion-compensated retime:
{
"name": "conform_from_url",
"arguments": {
"video_url": "https://cdn.example.com/footage/interview-30fps.mp4",
"audio_url": "https://cdn.example.com/footage/interview-mixed.wav",
"output_format": "mp4",
"options": {
"method": "interpolate_video",
"target_framerate": 24
}
}
}resample_video instead — it's near-instant, versus interpolation which can take significantly longer to encode.Example — true pulldown-style speed conform
Footage was shot at 24fps and needs to conform to a 25fps PAL-speed delivery: every frame is kept, but the whole thing plays back about 4% faster, and the audio needs to speed up by the same ratio to stay in sync.
{
"name": "conform_from_url",
"arguments": {
"video_url": "https://cdn.example.com/footage/master-24fps.mov",
"audio_url": "https://cdn.example.com/footage/master-mix-24fps.wav",
"output_format": "mov_prores",
"options": {
"method": "speed_conform",
"target_framerate": 25
}
}
}
// Botverse detects the source is 24fps and retimes both streams by 24/25 —
// output runs about 4% shorter in wall-clock time, same frame count, audio
// pitch/pace shifted to match.Example — audio track runs long, keep the video's length
A dubbed or remixed audio track that's a few seconds longer than the picture. Use duration_policy: "match_video" so the video is never cut short and the extra audio is what gets truncated:
{
"name": "conform_from_url",
"arguments": {
"video_url": "https://cdn.example.com/footage/promo-picture.mp4",
"audio_url": "https://cdn.example.com/footage/promo-audio-fr.wav",
"output_format": "mp4",
"options": {
"duration_policy": "match_video"
}
}
}Poll for completion, then download
let status;
do {
await new Promise(r => setTimeout(r, 5000));
status = await callTool("get_job_status", { job_id: "job_9a1c2f4e" });
} while (!["complete", "failed"].includes(status.status));
if (status.status === "complete") {
const { download_url } = await callTool("get_download_url", { job_id: "job_9a1c2f4e" });
}From the command line
Same pipeline, no agent required:
botverse conform video.mp4 audio.wav --to mp4 \ --method speed_conform --target-framerate 25
Example — a title card in front of the footage (head slate / bumper)
Put the image segment first. It holds for duration_seconds, then the video plays — with silent audio synthesised under the still so the track never drops out at the cut:
{
"name": "conform_splice_from_url",
"arguments": {
"segments": [
{ "type": "image", "url": "https://cdn.example.com/title-card.png", "duration_seconds": 3 },
{ "type": "video", "url": "https://cdn.example.com/episode-04.mp4" }
],
"output_format": "mp4"
}
}
// Botverse returns:
{
"job_id": "job_7f2b9a1c",
"status": "pending",
"segments": 2,
"estimated_cost_usd": 0.30
}Example — an end card after the footage (tail slate)
Same shape, image segment last instead of first:
{
"name": "conform_splice_from_url",
"arguments": {
"segments": [
{ "type": "video", "url": "https://cdn.example.com/episode-04.mp4" },
{ "type": "image", "url": "https://cdn.example.com/contact-card.png", "duration_seconds": 5 }
],
"output_format": "mp4"
}
}Example — joining two real clips (no image involved)
All-video segments splice the clips back-to-back — the same tool covers this with no image at all:
{
"name": "conform_splice_media",
"arguments": {
"segments": [
{ "type": "video", "object_key": "inputs/…/part-a.mp4" },
{ "type": "video", "object_key": "inputs/…/part-b.mp4" }
],
"output_format": "mp4"
}
}segments array is playback order.Which workflow to use
depends_on wiring the steps together.