异步处理(x-oss-async-process)适用于处理时间较长的场景,例如文档转换、视频转码、视频拼接、音频拼接。本文介绍如何使用文件URL、API和SDK等方式对存储于对象存储中的文件进行异步处理。
什么是异步处理
异步处理请求在返回时不会返回处理结果,需要配合另存为将处理结果持久化存储到对象存储中。另外建议通过使用消息通知获取异步任务的处理结果。更多信息,请参见另存为和消息通知。
支持的处理操作
功能 | 说明 | 操作名称 | 相关文档 |
文档处理 | 文档转换 | x-oss-async-process=doc/* 说明
| |
媒体处理 | 视频转码、视频转动图、视频截雪碧图、视频截帧、视频拼接、音频转码、音频拼接 |
|
使用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)
文档反馈