文档

异步处理

更新时间:

异步处理(x-oss-async-process)适用于处理时间较长的场景,例如文档转换、视频转码、视频拼接、音频拼接。本文介绍如何使用文件URL、API和SDK等方式对存储于对象存储中的文件进行异步处理。

什么是异步处理

异步处理请求在返回时不会返回处理结果,需要配合另存为将处理结果持久化存储到对象存储中。另外建议通过使用消息通知获取异步任务的处理结果。更多信息,请参见另存为消息通知

支持的处理操作

功能

说明

操作名称

相关文档

文档处理

文档转换

x-oss-async-process=doc/*

说明

*替换为对应的处理参数。

文档转换

媒体处理

视频转码、视频转动图、视频截雪碧图、视频截帧、视频拼接、音频转码、音频拼接

  • 视频:x-oss-async-process=video/*

  • 音频:x-oss-async-process=audio/*

使用SDK

支持异步处理操作的SDK版本如下:

  • Java:3.17.0及以上版本

  • Python:2.18.0及以上版本

  • Go:2.2.8及以上版本

package samples;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.*;
public class AsyncProcessObjectSample {
    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private static String endpoint = "<endpoint, http://oss-cn-hangzhou.aliyuncs.com>";
    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
    // 填写Bucket名称。
    private static String bucketName = "<bucketName>";
    // 异步处理后保存在OSS上的文件名。
    private static final String saveAsKey = "<syncSaveObjectName>";
    // OSS上的文件名。
    private static final String key = "<objectName>";
    public static void main(String[] args) {
        /*
         * Constructs a client instance with your account for accessing OSS
         */
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        try {
            StringBuilder styleBuilder = new StringBuilder();
            // 对文件进行视频转码,转码输出媒体文件为MP4,视频流格式为H.265,分辨率为1920x1080,帧率为30 fps,视频码率为2 Mbps,音频编码格式为AAC,音频码率为100 Kbps,禁用字幕流,转码完成后保存。
            styleBuilder.append("video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1");  // resize
            styleBuilder.append("|sys/saveas,");
            styleBuilder.append("o_" + BinaryUtil.toBase64String(saveAsKey.getBytes()).replaceAll("=", ""));
            styleBuilder.append(",");
            styleBuilder.append("b_" + BinaryUtil.toBase64String(bucketName.getBytes()).replaceAll("=", ""));
            AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, key, styleBuilder.toString());
            AsyncProcessObjectResult asyncProcessObject = ossClient.asyncProcessObject(request);
            System.out.println(asyncProcessObject.getAsyncRequestId());
            System.out.println(asyncProcessObject.getEventId());
            System.out.println(asyncProcessObject.getTaskId());
        } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message: " + oe.getMessage());
                System.out.println("Error Code:       " + oe.getErrorCode());
                System.out.println("Request ID:      " + oe.getRequestId());
                System.out.println("Host ID:           " + oe.getHostId());
        } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message: " + ce.getMessage());
        } finally {
            /*
             * Do not forget to shut down the client finally to release all allocated resources.
             */
            ossClient.shutdown();
        }
    }
}
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 指定Bucket名称。
bucket_name = 'examplebucket'
# 指定原视频文件名称。
source_key = 'srcexample.mp4'
# 指定处理后视频文件名称。
target_key = 'destexample.mp4'

# 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# 对srcexample.mp4进行视频转码。转码输出媒体文件容器为mp4,视频流格式为H.265,分辨率为1920x1080,帧率为30 fps,视频码率为2 Mbps;音频编码格式为aac,音频码率为100 Kbps,并禁用字幕流。
style = 'video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style,
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_key))).replace('=', ''),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(bucket.bucket_name))).replace('=', ''))

# 调用异步流媒体处理接口。
result = bucket.async_process_object(source_key, process)
print(result.status)
package main

import (
	"encoding/base64"
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
	"strings"
)

func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 指定视频所在的Bucket名称,例如examplebucket。
	bucketName := "examplebucket"
	bucket, err := client.Bucket(bucketName)
	// 存储的视频名称。
	targetObject := "outobjprefix"
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	sourceImageName := "demo.avi"

	//转化为MP4,视频流格式为H.265,分辨率为1920x1080,帧率为30 fps,视频码率为2 Mbps;音频编码格式为AAC,音频码率为100 Kbps;禁用字幕流;转码完成后将得到的文件保存为oss://examplebucket/outobjprefix.mp4。
	style := "video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1"

	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v", style, strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "="))
	fmt.Printf("%#v\n", process)
	rs, err := bucket.AsyncProcessObject(sourceImageName, process)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Printf("EventId:%s\n", rs.EventId)
	fmt.Printf("RequestId:%s\n", rs.RequestId)
	fmt.Printf("TaskId:%s\n", rs.TaskId)
}

使用REST API

如果对程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。

您可以在POSTObject接口中添加处理参数或样式参数的方式来处理文件。更多信息,请参见图片处理持久化。如下以视频转码处理场景为例。

  • 请求示例如下:

    POST /exmaple.avi?x-oss-async-process HTTP/1.1
    Host: video-demo.oss-cn-hangzhou.aliyuncs.com
    Date: Fri, 28 Oct 2022 06:40:10 GMT
    Authorization: OSS qn6qrrqxo2oawuk53otf****:UNQDb7GapEgJkcde6OhZ9J****
     
    // 对文件example.avi进行视频转码,转码输出媒体文件容器为MP4,视频流格式为H.265,分辨率为1920x1080,帧率为30 fps,视频码率为2 Mbps;音频流格式为AAC,音频码率为100 Kbps;禁用字幕流;转码完成后将得到的文件保存为oss://outbucket/outobjprefix.mp4。
    x-oss-async-process=video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ
  • 返回示例如下:

    {
        "EventId": "04D-1XDdkwRlySpH44nVfschYG6****",
        "RequestId": "94524D59-F249-5954-9D47-B93CDECDC56F",
        "TaskId": "MediaConvert-b6777a23-2967-4361-a1b7-55285977****" 
     }
  • 本页导读 (1)
文档反馈