Video Denoising
Description
This API submits a video denoising task. After a task is submitted successfully, the algorithm runs asynchronously. You can actively retrieve the algorithm result through the query API or receive the result through the callback URL provided in the request.
Version
1.0
Media Requirements
The source document specifies JPG and PNG image formats but does not provide any restrictions on video format, file size, dimensions, or duration.
API URL
Production environment: https://openapi.meitu.com
Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
Task name (task): /v1/videodenoise/481963
Task type (task_type): formulaMethod
POST
Content-Type: application/json
Authentication
Request Parameters
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | params | string | Algorithm parameters (JSON string) |
| Yes | init_images | object[] | List of media files |
| Yes | task | string | Fixed value: /v1/videodenoise/481963 |
| Yes | task_type | string | Fixed value: formula |
| No | sync_timeout | int | Default: 30; -1 means do not wait. If synchronous processing times out, status is 9 and the result must be retrieved through the query API. |
The structure of each media file in init_images is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | url | string | Media URL or base64-encoded data |
| Yes | profile | object | Media attribute information |
The structure of profile is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_profiles | object | Media properties |
| Yes | version | string | Fixed value: v1 |
The structure of media_profiles is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_data_type | string | url indicates a URL; for base64 input, use the corresponding media type. |
The params inference parameter is a JSON string with the following structure:
| Required | Field | Type | Description |
|---|---|---|---|
| No | rsp_media_type | string | Default: url; MP4 returns the result video as base64-encoded data. |
| Yes | parameter | object | Core algorithm parameters |
The algorithm-specific fields in parameter are as follows:
| Required | Field | Type | Description |
|---|---|---|---|
| Yes | denoise_level | string[] | Denoising levels: low for low, median for medium, and high for high. The algorithm is not executed if any other value is provided. Default: ["median"]. |
| No | mirro_info | int | 1 indicates mirroring; 0 indicates no mirroring. Default: 0. |
| No | client_type | int | 1 indicates a PC client; 0 indicates a mobile client. Default: 0. |
Request Example
{
"task": "/v1/videodenoise/481963",
"task_type": "formula",
"init_images": [
{
"url": "https://tos-vesdk-wink-sh.meitudata.com/mtlab_video/68daacf4a6bb1r0zqrmdip600.mov",
"profile": {
"media_profiles": {
"media_data_type": "url"
},
"version": "v1"
}
}
],
"params": "{\"rsp_media_type\":\"MP4\",\"parameter\":{\"denoise_level\":[\"median\",\"high\"],\"mirro_info\":0,\"client_type\":0}}",
"sync_timeout": 30
}Response Fields
Generated results are periodically deleted. Download and save them promptly.| Field | Type | Description |
|---|---|---|
| request_id | string | Request identifier |
| trace_id | string | Trace identifier |
| code | int | Business status code; 0 indicates that the request was accepted successfully. |
| error_code | int | Error code; 0 indicates success. |
| message | string | Business status message |
| tips | any | Additional information; may be null. |
| data | object | Task status and algorithm result |
The fields in data are as follows:
| Field | Type | Description |
|---|---|---|
| status | int | Status code: -1, task not found; 0, created successfully; 1, processing; 2, failed; 9, timed out—use the query API; 10, succeeded. |
| result | object | Algorithm result |
| progress | number | Task progress |
| predict_elapsed | int | Estimated processing time, in milliseconds |
| create_time | int64 | Creation timestamp, in milliseconds |
| task_id | string | Task ID |
| custom_task_id | string | Client-defined task ID |
| trace_id | string | Trace identifier within data |
| client_info | string | Client information |
| init_images | object[]/null | Echoed input media |
The fields in result are as follows:
| Field | Type | Description |
|---|---|---|
| id | string | Task result ID |
| urls | string[] | List of result URLs |
| code | int | Algorithm error code; returned on failure. |
| data | object | Algorithm error details; returned on failure. |
| msg | string | Algorithm error message; returned on failure. |
| msg_id | string | Message ID; returned on failure. |
The error detail fields in result.data are as follows:
| Field | Type | Description |
|---|---|---|
| duration | object | Durations and timestamps for each algorithm stage |
| error_code | int | Algorithm error code |
| error_msg | string | Algorithm error message |
| extra | object | Additional information |
| media_info_list | object[] | List of media information |
| msg_id | string | Message ID |
| parameter | any | Echoed algorithm parameters; null in the failure example. |
Response Examples
Successful Response
{
"request_id": "",
"trace_id": "",
"code": 0,
"error_code": 0,
"message": "",
"tips": null,
"data": {
"status": 10,
"result": {
"id": "50309bd5-a827-4125-bc96-62039c93770b",
"urls": [
"https://obs.mtlab.meitu.com/mtopen/rF5GIhp5ReLKgLV91CKj5BO1q2FTLMmc/MTY5Mjg1MzIwMA==/1c39ef92-04f1-40b4-5b7e-8fcfca0c11ea.png"
]
},
"progress": 1,
"predict_elapsed": 0,
"create_time": 0,
"task_id": "",
"custom_task_id": "",
"trace_id": "",
"client_info": "",
"init_images": null
}
}Response Requiring a Query
Use the query API to retrieve the result.
Response Status: 200
Content-Type: application/json; charset=utf-8
{
"request_id": "",
"trace_id": "",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 9,
"result": {
"id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e"
},
"progress": 0,
"predict_elapsed": 10000,
"create_time": 1759202368761,
"task_id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e",
"custom_task_id": "",
"trace_id": "9129a3a2-99c4-46ce-8731-0e100e2fbee7",
"client_info": "",
"init_images": null
}
}Failed Response
Response Status: 400
Content-Type: application/json; charset=utf-8
{
"request_id": "",
"trace_id": "",
"code": 20001,
"error_code": 20001,
"message": "ALGO_MODEL_CRASH",
"tips": null,
"data": {
"status": 2,
"result": {
"id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
"code": 20001,
"data": {
"duration": {
"alg_process_time": 0,
"created_timestamp": 1759201989,
"pull_timestamp": 1759201989,
"repost_time": 0,
"upload_time": 0,
"waiting_time": 0
},
"error_code": 20001,
"error_msg": "ALGO_MODEL_CRASH",
"extra": {},
"media_info_list": [],
"msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec",
"parameter": null
},
"msg": "ALGO_MODEL_CRASH",
"msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec"
},
"progress": 1,
"predict_elapsed": 10000,
"create_time": 1759201989444,
"task_id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
"custom_task_id": "",
"trace_id": "",
"client_info": "",
"init_images": null
}
}General Error Codes
The source document lists the following API-specific error: error code 20001, error message PROCESS_ERROR, meaning "processing error." In the failure example, the same error code is paired with the error message ALGO_MODEL_CRASH.
See API Error Codes for details.
SDK Examples
Python
import json
import requests
from sign_sdk import sign
def api_call_example():
key = "your_api_key"
secret = "your_api_secret"
url = "https://openapi.meitu.com/api/v1/sdk/sync/push"
method = "POST"
headers = {
"Content-Type": "application/json",
sign.HeaderHost: "openapi.meitu.com",
}
inner_params = {
"rsp_media_type": "MP4",
"parameter": {
"denoise_level": ["median", "high"],
"mirro_info": 0,
"client_type": 0,
},
}
payload = {
"task": "/v1/videodenoise/481963",
"task_type": "formula",
"init_images": [
{
"url": "https://tos-vesdk-wink-sh.meitudata.com/mtlab_video/68daacf4a6bb1r0zqrmdip600.mov",
"profile": {
"media_profiles": {"media_data_type": "url"},
"version": "v1",
},
}
],
"params": json.dumps(inner_params, ensure_ascii=False),
"sync_timeout": 30,
}
body = json.dumps(payload, ensure_ascii=False)
signer = sign.Signer(key, secret)
signed_request = signer.sign(url, method, headers, body)
response = requests.Session().send(signed_request)
print(f"Status: {response.status_code}")
print(f"Response: {response.text}")
if __name__ == "__main__":
api_call_example()Go
package main
import (
"fmt"
"io"
"net/http"
"github.com/mtlab/api/signer"
)
func main() {
key := "your_api_key"
secret := "your_api_secret"
signObj := signer.NewSigner(key, secret)
url := "https://openapi.meitu.com/api/v1/sdk/sync/push"
method := http.MethodPost
headers := make(http.Header)
headers.Set(signer.HeaderHost, "openapi.meitu.com")
headers.Set("Content-Type", "application/json")
body := `{
"task": "/v1/videodenoise/481963",
"task_type": "formula",
"init_images": [{
"url": "https://tos-vesdk-wink-sh.meitudata.com/mtlab_video/68daacf4a6bb1r0zqrmdip600.mov",
"profile": {
"media_profiles": {"media_data_type": "url"},
"version": "v1"
}
}],
"params": "{\"rsp_media_type\":\"MP4\",\"parameter\":{\"denoise_level\":[\"median\",\"high\"],\"mirro_info\":0,\"client_type\":0}}",
"sync_timeout": 30
}`
req, err := signObj.Sign(url, method, headers, body)
if err != nil {
fmt.Println("Failed to sign request:", err)
return
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Failed to send request:", err)
return
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read response failed:", err)
return
}
fmt.Println("Response:", resp.StatusCode, string(responseBody))
}PHP
<?php
require 'signer.php';
$key = 'your_api_key';
$secret = 'your_api_secret';
$signer = new Signer($key, $secret);
$url = 'https://openapi.meitu.com/api/v1/sdk/sync/push';
$method = 'POST';
$headers = ['Content-Type' => 'application/json'];
$innerParams = json_encode([
'rsp_media_type' => 'MP4',
'parameter' => [
'denoise_level' => ['median', 'high'],
'mirro_info' => 0,
'client_type' => 0,
],
]);
$body = json_encode([
'task' => '/v1/videodenoise/481963',
'task_type' => 'formula',
'init_images' => [
[
'url' => 'https://tos-vesdk-wink-sh.meitudata.com/mtlab_video/68daacf4a6bb1r0zqrmdip600.mov',
'profile' => [
'media_profiles' => ['media_data_type' => 'url'],
'version' => 'v1',
],
],
],
'params' => $innerParams,
'sync_timeout' => 30,
]);
$curl = $signer->sign($url, $method, $headers, $body);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($status === 0) {
echo 'Error: ' . curl_error($curl);
} else {
echo "Status: {$status}\n";
echo "Response: {$response}\n";
}
curl_close($curl);
?>Java
package com.meitu.openai.common;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
Signer signer = new Signer("your_api_key", "your_api_secret");
String url = "https://openapi.meitu.com/api/v1/sdk/sync/push";
String method = "POST";
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
headers.put(Signer.HeaderHost, "openapi.meitu.com");
String body = "{\n" +
" \"task\": \"/v1/videodenoise/481963\",\n" +
" \"task_type\": \"formula\",\n" +
" \"init_images\": [{\n" +
" \"url\": \"https://tos-vesdk-wink-sh.meitudata.com/mtlab_video/68daacf4a6bb1r0zqrmdip600.mov\",\n" +
" \"profile\": {\n" +
" \"media_profiles\": {\"media_data_type\": \"url\"},\n" +
" \"version\": \"v1\"\n" +
" }\n" +
" }],\n" +
" \"params\": \"{\\\"rsp_media_type\\\":\\\"MP4\\\",\\\"parameter\\\":{\\\"denoise_level\\\":[\\\"median\\\",\\\"high\\\"],\\\"mirro_info\\\":0,\\\"client_type\\\":0}}\",\n" +
" \"sync_timeout\": 30\n" +
"}";
Map<String, String> signedHeaders = signer.sign(url, method, headers, body);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod(method);
for (Map.Entry<String, String> entry : signedHeaders.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
connection.setDoOutput(true);
connection.getOutputStream().write(body.getBytes(StandardCharsets.UTF_8));
int status = connection.getResponseCode();
InputStream stream = status >= 400
? connection.getErrorStream()
: connection.getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
System.out.println("Response: " + status + " " + response);
}
}
}