Concatenar clipes de áudio: duração e pontos iniciais
Planejar uma concatenação de áudio fica mais simples quando todos os limites são conhecidos antes da renderização.
Executar grátis
Esta calculadora recebe as durações na ordem desejada, soma os valores e informa o instante em que cada clipe começa na linha do tempo combinada. O primeiro sempre começa em zero, e cada deslocamento seguinte corresponde à soma das durações anteriores. Use o resultado para preparar capítulos, legendas, decisões de edição, folhas de marcação, controles de reprodução ou validações sem enviar nem processar o áudio.
Informe as durações na ordem de reprodução
Forneça uma duração em segundos para cada clipe, exatamente na ordem em que eles aparecerão. Valores decimais são aceitos, portanto um clipe com 12.375 segundos não precisa ser arredondado. Zero também é válido para espaços reservados ou itens que não ocupam tempo. Cada valor deve ser um número finito e não negativo, e uma solicitação pode conter no máximo 10,000 clipes. A lista não pode ficar vazia, pois uma sequência vazia não possui limites úteis. A ferramenta usa somente durações: não examina arquivos, decodifica mídia, muda a taxa de amostragem, insere fades nem modifica áudio. Assim, você pode usá-la no início do fluxo, quando os metadados já existem, mas os arquivos ainda estão remotos, são grandes ou aguardam aprovação. Mantenha todos os valores em segundos e obtenha-os de uma fonte consistente para que a linha do tempo corresponda ao programa que fará a concatenação real.
Interprete a linha do tempo combinada
A resposta possui dois campos. total_duration soma todas as durações e representa o comprimento, em segundos, de uma união sem intervalos. clip_starts é uma lista alinhada por índice com a entrada. O primeiro valor é zero porque o primeiro clipe começa no início; cada valor posterior acumula todos os clipes anteriores. Se os dois primeiros tiverem 12.5 e 8.25 segundos, o terceiro começará em 20.75. A saída mantém segundos numéricos em vez de formatar horários como texto, facilitando o uso em código, legendas, manifestos ou editores que adotam convenções próprias. Os acumulados são normalizados em doze casas decimais para eliminar artefatos binários comuns, como uma cauda longa na soma de 0.1 e 0.2, sem perder a precisão prática oferecida pelos metadados de áudio.
Use os deslocamentos sem presumir uma união renderizada
Considere os deslocamentos um plano determinístico para uma sequência contínua, e não medições de um arquivo já codificado. Um pipeline real pode alterar tempos ao cortar amostras, aplicar crossfades, inserir silêncio, reamostrar, acrescentar preenchimento do codec ou arredondar limites para quadros. Se alguma dessas operações fizer parte da junção, ajuste as durações para representar a contribuição efetiva de cada clipe ou valide o arquivo final. Em uma concatenação direta, os valores podem orientar capítulos, deslocamentos de transcrições, rótulos de formas de onda, navegação e verificações de qualidade. Eles também permitem comparar uma playlist proposta com um limite de duração antes de gastar recursos de renderização. Como o cálculo é puro e não usa rede, a mesma entrada sempre gera a mesma resposta no navegador e na API. Solicitações automatizadas custam US$ 0,002, enquanto a página executa o cálculo localmente para um planejamento rápido.
Casos de uso
Criar marcadores de capítulos
Converta comprimentos ordenados em posições exatas de capítulos para podcasts, aulas ou audiolivros.
Deslocar pontos da transcrição
Some o início de cada clipe aos tempos locais antes de reunir as transcrições em uma sequência.
Verificar a duração de uma playlist
Calcule o tempo completo e cada transição antes de enviar a mídia ao pipeline de renderização.
Perguntas frequentes
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. Você também pode executar o cálculo localmente no navegador.
Qual unidade devo usar?
Informe todas as durações em segundos. Decimais são aceitos, e durações e deslocamentos também são retornados em segundos.
Esta capacidade une arquivos de áudio?
Não. Ela calcula a linha do tempo de uma lista ordenada; não envia, decodifica, codifica nem concatena arquivos de mídia.
A lista de durações pode ficar vazia?
Não. É necessária pelo menos a duração de um clipe; uma lista vazia retorna um erro de entrada inválida.
Intervalos ou crossfades são incluídos?
Somente se você os considerar nas durações. O cálculo não acrescenta automaticamente intervalos nem sobreposições.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/audio/merge-clips \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"durations":[12.5,8.25,3]}'const res = await fetch("https://api.kit.forhosting.com/audio/merge-clips", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"durations": [
12.5,
8.25,
3
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/merge-clips",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"durations": [
12.5,
8.25,
3
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/merge-clips", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"durations":[12.5,8.25,3]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"durations":[12.5,8.25,3]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/merge-clips", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"durations": [
12.5,
8.25,
3
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.merge_clips",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_mb | 200 |
max_minutes | 180 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |