Video frame rate conversion calculator
This video frame rate conversion calculator shows what happens when footage moves from one playback rate to another.
Run — free
Enter the source rate, target rate, and source frame count to see whether a duration-preserving conversion needs duplicated or dropped frames, the nearest whole target frame count, and the exact duration obtained by keeping every original frame instead. It is useful for planning conform, retiming, animation, archival, and delivery workflows before opening an editor or transcoder.
Choose between matching duration and preserving frames
Frame rate conversion can describe two different operations, and confusing them is a common source of timing mistakes. A duration-preserving conversion keeps the running time close to the source. To do that, the calculator multiplies the source frame count by the target-to-source rate ratio. Moving to a higher rate requires more displayed frames, so frames must be duplicated or synthesized; moving to a lower rate requires fewer displayed frames, so frames must be dropped or blended. Because an actual video cannot contain a fraction of a frame, the ideal count is rounded to the nearest whole frame and both values are reported. The alternative is a frame-preserving conform. In that case, no frame is created or removed: every source frame is simply played at the target rate. The running time therefore changes. This distinction matters because a 24 fps clip converted for 30 fps delivery is not the same operation as the same 240 frames interpreted as 30 fps footage. The first aims to retain ten seconds; the second lasts eight seconds.
Read the frame counts and timing results
Start with the action field. It says duplicate when the target rate is higher, drop when it is lower, and none when both rates match. The conversion ratio is target frame rate divided by source frame rate. The ideal target frame count applies that ratio to the source count and represents the mathematical amount needed to preserve duration exactly. The target frame count is its nearest usable whole-frame value. Frames to duplicate and frames to drop compare that rounded result with the original count, so only one will be greater than zero. For timing, source duration is the source frame count divided by the source rate. Preserved frame count duration divides that same count by the target rate instead. Duration change subtracts the original duration from the frame-preserved duration: a negative result means the clip becomes shorter, while a positive result means it becomes longer. Reported timing values are rounded to nine decimal places for stable output, while the calculation itself uses the full numeric inputs.
Apply the calculation in real production workflows
Use the result as a planning calculation rather than as a claim about a particular interpolation algorithm. The tool tells you how many frame positions the rate relationship requires, but it does not choose whether an application should repeat frames, blend neighboring images, estimate optical flow, or change playback speed. Those choices affect motion quality, cadence, audio handling, and render cost. For editorial delivery, compare the rounded duration-preserving target count with the expected timeline length before transcoding. For animation, the duplicate count can help estimate how often held drawings or rendered frames will repeat at the delivery rate. For archival or restoration work, the frame-preserved duration exposes the exact speed change introduced by interpreting historical footage at a modern rate. Decimal rates such as 23.976 and 29.97 are accepted, as are exact integer rates. Both rates must be positive finite numbers, and the source frame count must be a positive safe integer. The API charges $0.002 per calculation, while the browser calculation uses the same deterministic core logic.
What you can do with it
Plan a delivery-rate conversion
Estimate the whole target frame count and the number of duplicated or dropped frames before exporting a master at another frame rate.
Calculate conform duration
Find how long a clip becomes when all original frames are retained but played at a different frame rate.
Check animation and archival timing
Compare rate ratios, frame adjustments, and speed-related duration changes for animation, restoration, or historical footage.
FAQ
What does the calculation cost?
The API price is $0.002 per calculation. The calculation on this page can also run in the browser.
Why can the ideal target frame count contain a decimal?
The rate ratio can produce a fractional mathematical count. Since video contains whole frames, the usable target count is rounded to the nearest integer.
Does duplicate mean every added frame is an identical copy?
No. It means additional frame positions are required. A video tool may fill them by repetition, blending, interpolation, or another method.
What does preserving frame count do to duration?
It keeps every source frame and interprets them at the target rate. A higher target rate shortens playback, while a lower target rate lengthens it.
Can I enter rates such as 23.976 or 29.97?
Yes. Positive finite decimal frame rates are supported. Use the precise rates required by your workflow.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/video/framerate-convert \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"source_framerate":24,"target_framerate":30,"frame_count":240}'const res = await fetch("https://api.kit.forhosting.com/video/framerate-convert", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"source_framerate": 24,
"target_framerate": 30,
"frame_count": 240
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video/framerate-convert",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"source_framerate": 24,
"target_framerate": 30,
"frame_count": 240
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video/framerate-convert", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"source_framerate":24,"target_framerate":30,"frame_count":240}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"source_framerate":24,"target_framerate":30,"frame_count":240}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video/framerate-convert", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"source_framerate": 24,
"target_framerate": 30,
"frame_count": 240
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.framerate_convert",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |