通用
产品演示、课程、活动回放
没有更贴的类型时填 0。
先选场景
这个编号就是 scene_id。选最接近的一类,接口按这类内容去找高光。
产品演示、课程、活动回放
没有更贴的类型时填 0。
讲解、卖点和成交瞬间
直播回放填 1。
进球、回合和关键判罚
比赛录像填 2。
观点、金句和问答
长演讲、访谈填 3。
高能片段和话题点
影视、综艺填 4。
再选切法
这个值就是 slice_method。0 是原样截一段,1 是把多段拼成一条。
从原片里完整截一段
讲述顺序保持不变。
把多段高光收成一条
按同一个主题拼在一起。
时长填其中一档,单位是秒。字段名是 slice_length。不传时大约按 30~180 秒来切。
然后调用
先创建,记住 task_id,再查询。密钥只放在你自己的服务端。
要的是 URL,不是本地文件。
自有文件先上传到用户文件空间,再把返回的地址拿来提交。
POST /api/video/clip
带上地址、场景、切法和时长。成功时返回的就是下一步要用的任务号。
state 为 1 时,读 file_url。
GET /api/video/clip_taskquery,带上刚才的 task_id。每条结果还有主题 theme 和概要 summary。
点语言名切换。每种语言都是同一件事:先创建,再用 task_id 查询。
<?php
$apiKey = '你的密钥';
$body = json_encode([
'url' => 'https://example.com/video.mp4',
'scene_id' => '1',
'slice_method' => 0,
'slice_length' => '30~60',
], JSON_UNESCAPED_UNICODE);
$create = curl_init('https://xiaoapis.com/api/video/clip?key=' . rawurlencode($apiKey));
curl_setopt_array($create, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => $body,
CURLOPT_RETURNTRANSFER => true,
]);
$created = json_decode(curl_exec($create), true);
curl_close($create);
$taskId = $created['data']['task_id'];
$query = 'https://xiaoapis.com/api/video/clip_taskquery?key=' . rawurlencode($apiKey)
. '&task_id=' . rawurlencode($taskId);
$result = json_decode(file_get_contents($query), true);
print_r($result['data']['result']);
const apiKey = '你的密钥';
const created = await fetch(
`https://xiaoapis.com/api/video/clip?key=${encodeURIComponent(apiKey)}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
url: 'https://example.com/video.mp4',
scene_id: '1',
slice_method: 0,
slice_length: '30~60',
}),
}
).then((res) => res.json());
const taskId = created.data.task_id;
const queried = await fetch(
`https://xiaoapis.com/api/video/clip_taskquery?key=${encodeURIComponent(apiKey)}&task_id=${encodeURIComponent(taskId)}`
).then((res) => res.json());
console.log(queried.data.result);
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class ClipDemo {
public static void main(String[] args) throws Exception {
String apiKey = URLEncoder.encode("你的密钥", StandardCharsets.UTF_8);
String json = """
{
"url": "https://example.com/video.mp4",
"scene_id": "1",
"slice_method": 0,
"slice_length": "30~60"
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest create = HttpRequest.newBuilder()
.uri(URI.create("https://xiaoapis.com/api/video/clip?key=" + apiKey))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
String created = client.send(create, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(created);
String taskId = URLEncoder.encode("返回的任务标识", StandardCharsets.UTF_8);
HttpRequest query = HttpRequest.newBuilder()
.uri(URI.create("https://xiaoapis.com/api/video/clip_taskquery?key=" + apiKey + "&task_id=" + taskId))
.GET()
.build();
System.out.println(client.send(query, HttpResponse.BodyHandlers.ofString()).body());
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
apiKey := url.QueryEscape("你的密钥")
body, _ := json.Marshal(map[string]any{
"url": "https://example.com/video.mp4",
"scene_id": "1",
"slice_method": 0,
"slice_length": "30~60",
})
resp, err := http.Post(
"https://xiaoapis.com/api/video/clip?key="+apiKey,
"application/json",
bytes.NewReader(body),
)
if err != nil {
panic(err)
}
defer resp.Body.Close()
raw, _ := io.ReadAll(resp.Body)
fmt.Println(string(raw))
taskID := url.QueryEscape("返回的任务标识")
got, err := http.Get("https://xiaoapis.com/api/video/clip_taskquery?key=" + apiKey + "&task_id=" + taskID)
if err != nil {
panic(err)
}
defer got.Body.Close()
out, _ := io.ReadAll(got.Body)
fmt.Println(string(out))
}
import json
import urllib.parse
import urllib.request
api_key = "你的密钥"
body = json.dumps({
"url": "https://example.com/video.mp4",
"scene_id": "1",
"slice_method": 0,
"slice_length": "30~60",
}, ensure_ascii=False).encode("utf-8")
create = urllib.request.Request(
"https://xiaoapis.com/api/video/clip?key=" + urllib.parse.quote(api_key),
data=body,
headers={"Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(create) as resp:
created = json.load(resp)
query = "https://xiaoapis.com/api/video/clip_taskquery?" + urllib.parse.urlencode({
"key": api_key,
"task_id": created["data"]["task_id"],
})
with urllib.request.urlopen(query) as resp:
result = json.load(resp)
print(result["data"]["result"])
const https = require('https');
const apiKey = '你的密钥';
const payload = JSON.stringify({
url: 'https://example.com/video.mp4',
scene_id: '1',
slice_method: 0,
slice_length: '30~60',
});
function request(options, body) {
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
let raw = '';
res.on('data', (chunk) => { raw += chunk; });
res.on('end', () => resolve(JSON.parse(raw)));
});
req.on('error', reject);
if (body) req.write(body);
req.end();
});
}
(async () => {
const created = await request({
hostname: 'xiaoapis.com',
path: '/api/video/clip?key=' + encodeURIComponent(apiKey),
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(payload),
},
}, payload);
const queried = await request({
hostname: 'xiaoapis.com',
path: '/api/video/clip_taskquery?key=' + encodeURIComponent(apiKey)
+ '&task_id=' + encodeURIComponent(created.data.task_id),
method: 'GET',
});
console.log(queried.data.result);
})();
#include <curl/curl.h>
#include <stdio.h>
int main(void) {
CURL *curl = curl_easy_init();
struct curl_slist *headers = NULL;
const char *json =
"{\"url\":\"https://example.com/video.mp4\","
"\"scene_id\":\"1\","
"\"slice_method\":0,"
"\"slice_length\":\"30~60\"}";
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://xiaoapis.com/api/video/clip?key=你的密钥");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json);
curl_easy_perform(curl);
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
curl_easy_setopt(curl, CURLOPT_URL,
"https://xiaoapis.com/api/video/clip_taskquery?key=你的密钥&task_id=返回的任务标识");
curl_easy_perform(curl);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
return 0;
}
#include <curl/curl.h>
#include <iostream>
#include <string>
int main() {
CURL *curl = curl_easy_init();
struct curl_slist *headers = nullptr;
std::string json =
R"({"url":"https://example.com/video.mp4","scene_id":"1","slice_method":0,"slice_length":"30~60"})";
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://xiaoapis.com/api/video/clip?key=你的密钥");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str());
curl_easy_perform(curl);
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
curl_easy_setopt(curl, CURLOPT_URL,
"https://xiaoapis.com/api/video/clip_taskquery?key=你的密钥&task_id=返回的任务标识");
curl_easy_perform(curl);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
return 0;
}
using System.Net.Http;
using System.Text;
var apiKey = Uri.EscapeDataString("你的密钥");
var json = """
{
"url": "https://example.com/video.mp4",
"scene_id": "1",
"slice_method": 0,
"slice_length": "30~60"
}
""";
using var client = new HttpClient();
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var created = await client.PostAsync(
$"https://xiaoapis.com/api/video/clip?key={apiKey}",
content);
Console.WriteLine(await created.Content.ReadAsStringAsync());
var taskId = Uri.EscapeDataString("返回的任务标识");
var queried = await client.GetAsync(
$"https://xiaoapis.com/api/video/clip_taskquery?key={apiKey}&task_id={taskId}");
Console.WriteLine(await queried.Content.ReadAsStringAsync());
Imports System.Net.Http
Imports System.Text
Module ClipDemo
Sub Main()
Dim apiKey = Uri.EscapeDataString("你的密钥")
Dim json = "{""url"":""https://example.com/video.mp4"",""scene_id"":""1"",""slice_method"":0,""slice_length"":""30~60""}"
Using client As New HttpClient()
Dim body As New StringContent(json, Encoding.UTF8, "application/json")
Dim created = client.PostAsync("https://xiaoapis.com/api/video/clip?key=" & apiKey, body).Result
Console.WriteLine(created.Content.ReadAsStringAsync().Result)
Dim taskId = Uri.EscapeDataString("返回的任务标识")
Dim queried = client.GetAsync("https://xiaoapis.com/api/video/clip_taskquery?key=" & apiKey & "&task_id=" & taskId).Result
Console.WriteLine(queried.Content.ReadAsStringAsync().Result)
End Using
End Sub
End Module
别踩这四条
下面四条是硬限制。价格和免费额度以接口文档为准。
没有音轨就识别不到内容,任务会失败。
时长和体积只要超一条,就会被拒绝。
必须是 http 或 https,最长 512 字。路径没有扩展名时补 extension。
20 点/分钟,约 0.2 元/分钟。切出 3 条也只按原片时长算一次。
问答
这里只写本接口已经公开的行为。价格、额度和频率以文档页和控制台为准。
准备公网视频地址,调用 AI 视频切片创建任务,拿到 task_id 后调用任务查询。state 为 1 时,从 result 读取每条切片的主题、概要、时间和文件地址。
scene_id 用 0 到 4,对应通用、直播、体育赛事、访谈演讲、影视综艺。slice_method 为 0 是连续片段,为 1 是智能拼接。slice_length 填时长档,例如 30~60。默认时长档是 30~180。
每条结果包含 start、end、duration、file_url、theme、summary。start 和 end 的单位是毫秒,file_url 是这条切片的下载地址。
地址下载失败、文件损坏或格式不对、超出大小、处理超时,或没有识别到有效语音,state 会是负数。处理中常见为排队、准备、等待和处理。
file_url 可以直接分发,也可以作为素材交给智能剪辑,做口播混剪、新闻混剪或视频包装。