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): formula

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signature

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters (JSON string)
Yesinit_imagesobject[]List of media files
YestaskstringFixed value: /v1/videodenoise/481963
Yestask_typestringFixed value: formula
Nosync_timeoutintDefault: 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:

RequiredParameterTypeDescription
YesurlstringMedia URL or base64-encoded data
YesprofileobjectMedia attribute information

The structure of profile is as follows:

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia properties
YesversionstringFixed value: v1

The structure of media_profiles is as follows:

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates a URL; for base64 input, use the corresponding media type.

The params inference parameter is a JSON string with the following structure:

RequiredFieldTypeDescription
Norsp_media_typestringDefault: url; MP4 returns the result video as base64-encoded data.
YesparameterobjectCore algorithm parameters

The algorithm-specific fields in parameter are as follows:

RequiredFieldTypeDescription
Yesdenoise_levelstring[]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"].
Nomirro_infoint1 indicates mirroring; 0 indicates no mirroring. Default: 0.
Noclient_typeint1 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.
FieldTypeDescription
request_idstringRequest identifier
trace_idstringTrace identifier
codeintBusiness status code; 0 indicates that the request was accepted successfully.
error_codeintError code; 0 indicates success.
messagestringBusiness status message
tipsanyAdditional information; may be null.
dataobjectTask status and algorithm result

The fields in data are as follows:

FieldTypeDescription
statusintStatus code: -1, task not found; 0, created successfully; 1, processing; 2, failed; 9, timed out—use the query API; 10, succeeded.
resultobjectAlgorithm result
progressnumberTask progress
predict_elapsedintEstimated processing time, in milliseconds
create_timeint64Creation timestamp, in milliseconds
task_idstringTask ID
custom_task_idstringClient-defined task ID
trace_idstringTrace identifier within data
client_infostringClient information
init_imagesobject[]/nullEchoed input media

The fields in result are as follows:

FieldTypeDescription
idstringTask result ID
urlsstring[]List of result URLs
codeintAlgorithm error code; returned on failure.
dataobjectAlgorithm error details; returned on failure.
msgstringAlgorithm error message; returned on failure.
msg_idstringMessage ID; returned on failure.

The error detail fields in result.data are as follows:

FieldTypeDescription
durationobjectDurations and timestamps for each algorithm stage
error_codeintAlgorithm error code
error_msgstringAlgorithm error message
extraobjectAdditional information
media_info_listobject[]List of media information
msg_idstringMessage ID
parameteranyEchoed 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);
        }
    }
}