MeideDe - Video Color Enhancement
Description
This API submits a video color enhancement task. The algorithm starts processing after the task is successfully submitted. The result is returned synchronously when available. If the task times out or is still processing, use the query API to retrieve the result.
Version
1.0
Media Requirements
- Supported format: MP4
- File size: No more than 30 MB
- Only video URL requests are currently supported
API URL
Production environment: https://openapi.meitu.com
Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
Task name (task): /v1/videoenhance/491343
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[] | Media file list |
| Yes | task | string | Fixed value: /v1/videoenhance/491343 |
| Yes | task_type | string | Fixed value: formula |
| No | sync_timeout | int | Synchronous timeout in seconds. Default: 30 |
The structure of each media file in init_images is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | url | string | Video URL. This API currently supports URL requests only |
| Yes | profile | object | Attribute information |
The structure of profile is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_profiles | object | Media attribute information |
| Yes | version | string | Fixed value: v1 |
The structure of media_profiles is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_data_type | string | Fixed value: url, indicating a video URL |
| No | mirro_info | int | 1 means mirrored; 0 means not mirrored. Default: 0 |
| No | orientation_tag | int | A value from 1 to 8, representing the eight EXIF orientation tag directions. Default: 1 |
| No | return_video | int | 0 returns a ZIP matrix package; 1 returns a video. Default: 0 |
The params inference parameter is a JSON string with the following structure:
| Required | Field | Type | Description |
|---|---|---|---|
| No | rsp_media_type | string | Default: url; jpg indicates base64 |
| Yes | parameter | object | Core algorithm parameter object |
Details of the algorithm parameters in parameter:
| Required | Parameter | Type | Description |
|---|---|---|---|
| No | repost_url | string | POST callback URL provided by the client |
| No | rsp_media_type | string | MP4: Returns the result video directly as base64-encoded data |
Request Examples
Return a ZIP Matrix Package
{
"task": "/v1/videoenhance/491343",
"task_type": "formula",
"init_images": [
{
"url": "https://example.com/input.mp4",
"profile": {
"media_profiles": {
"media_data_type": "url",
"mirro_info": 0,
"return_video": 0
},
"version": "v1"
}
}
],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"repost_url\":\"http://example.com/callback\"}}",
"sync_timeout": 30
}Return an MP4 Video
{
"task": "/v1/videoenhance/491343",
"task_type": "formula",
"init_images": [
{
"url": "https://example.com/input.mp4",
"profile": {
"media_profiles": {
"media_data_type": "url",
"mirro_info": 0,
"orientation_tag": 1,
"return_video": 1
},
"version": "v1"
}
}
],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"rsp_media_type\":\"MP4\"}}",
"sync_timeout": 30
}Response Fields
Note: Generated results are periodically removed. 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 on success |
| message | string | Business message |
| tips | any | Additional information; may be null |
| data | object | Task status and algorithm result |
Fields in data:
| Field | Type | Description |
|---|---|---|
| status | int | -1: task not found; 0: created; 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 |
Fields in result:
| Field | Type | Description |
|---|---|---|
| id | string | Task result ID |
| urls | array | Result file URL list |
| images | array | Result file URL list |
| media_info_list | array | Result media information list |
| msg_id | string | Unique request identifier generated by the algorithm service |
| msg | string | Result status message |
| code | int | Algorithm error code |
| data | object | Detailed result returned by the algorithm service |
Fields in each element of media_info_list:
| Field | Type | Description |
|---|---|---|
| media_data | string | Result file URL |
| media_profiles | object | Media attribute information |
| media_extra | object | Extended media information |
Fields in media_profiles:
| Field | Type | Description |
|---|---|---|
| media_data_type | string | Media type |
| media_data_width | int | Media width |
| media_data_height | int | Media height |
| media_data_size | int | Media file size |
Fields in data.result.data on failure:
| Field | Type | Description |
|---|---|---|
| duration | object | Processing time information for each algorithm task stage |
| error_code | int | Algorithm error code |
| error_msg | string | Algorithm error message |
| extra | object | Extended algorithm information |
| media_info_list | array | Result media information list |
| msg_id | string | Unique request identifier generated by the algorithm service |
| parameter | object/null | Echoed algorithm parameters |
Fields in duration:
| Field | Type | Description |
|---|---|---|
| alg_process_time | int | Algorithm processing time |
| created_timestamp | int | Task creation timestamp |
| pull_timestamp | int | Task retrieval timestamp |
| repost_time | int | Callback time |
| upload_time | int | Upload time |
| waiting_time | int | Waiting time |
Response Examples
Successful Response Example
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": 10,
"result": {
"id": "t_mt1a3i5n7b12345678-1234-4abc-9def-123456789abc",
"urls": [
"https://example.com/result/videoenhance_result.mp4"
],
"images": [
"https://example.com/result/videoenhance_result.mp4"
],
"media_info_list": [
{
"media_data": "https://example.com/result/videoenhance_result.mp4",
"media_profiles": {
"media_data_type": "MP4",
"media_data_width": 720,
"media_data_height": 1280,
"media_data_size": 10485760
},
"media_extra": {}
}
],
"msg_id": "3911018f-faa7-4813-919c-dddddd5fcbac",
"msg": "success",
"data": {}
},
"progress": 1,
"predict_elapsed": 10000,
"create_time": 1759202368761,
"task_id": "t_mt1a3i5n7b12345678-1234-4abc-9def-123456789abc",
"custom_task_id": "",
"trace_id": "9129a3a2-99c4-46ce-8731-0e100e2fbee7",
"client_info": "",
"init_images": null
}
}Query-Required Response Example
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 Example
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
This API currently has no API-specific error codes. 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": "url",
"parameter": {"rsp_media_type": "MP4"},
}
payload = {
"task": "/v1/videoenhance/491343",
"task_type": "formula",
"init_images": [
{
"url": "https://example.com/input.mp4",
"profile": {
"media_profiles": {
"media_data_type": "url",
"mirro_info": 0,
"orientation_tag": 1,
"return_video": 1,
},
"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/videoenhance/491343",
"task_type": "formula",
"init_images": [{
"url": "https://example.com/input.mp4",
"profile": {
"media_profiles": {
"media_data_type": "url",
"mirro_info": 0,
"orientation_tag": 1,
"return_video": 1
},
"version": "v1"
}
}],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"rsp_media_type\":\"MP4\"}}",
"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' => 'url',
'parameter' => ['rsp_media_type' => 'MP4'],
]);
$body = json_encode([
'task' => '/v1/videoenhance/491343',
'task_type' => 'formula',
'init_images' => [
[
'url' => 'https://example.com/input.mp4',
'profile' => [
'media_profiles' => [
'media_data_type' => 'url',
'mirro_info' => 0,
'orientation_tag' => 1,
'return_video' => 1,
],
'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/videoenhance/491343\",\n" +
" \"task_type\": \"formula\",\n" +
" \"init_images\": [{\n" +
" \"url\": \"https://example.com/input.mp4\",\n" +
" \"profile\": {\n" +
" \"media_profiles\": {\n" +
" \"media_data_type\": \"url\",\n" +
" \"mirro_info\": 0,\n" +
" \"orientation_tag\": 1,\n" +
" \"return_video\": 1\n" +
" },\n" +
" \"version\": \"v1\"\n" +
" }\n" +
" }],\n" +
" \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{\\\"rsp_media_type\\\":\\\"MP4\\\"}}\",\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);
}
}
}