Go异步处理

更新时间:2025-02-20 02:26:16

异步处理(x-oss-async-process)是指程序执行一个任务时,不需要等待该任务完成就能继续执行其他任务。本文介绍如何使用Go SDK V2进行异步处理的场景,例如文档转换、视频转码、视频拼接等。

注意事项

  • 本文示例代码以华东1(杭州)的地域IDcn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

方法定义

func (c *Client) AsyncProcessObject(ctx context.Context, request *AsyncProcessObjectRequest, optFns ...func(*Options)) (*AsyncProcessObjectResult, error)

请求参数列表

参数名

类型

说明

参数名

类型

说明

ctx

context.Context

请求的上下文,可以用来设置请求的总时限

request

*AsyncProcessObjectRequest

设置具体接口的请求参数,具体请参见AsyncProcessObjectRequest

optFns

...func(*Options)

(可选)接口级的配置参数, 具体请参见Options

返回值列表

返回值名

类型

说明

返回值名

类型

说明

result

*AsyncProcessObjectResult

接口返回值,当 err 为nil 时有效,具体请参见AsyncProcessObjectResult

err

error

请求的状态,当请求失败时,err 不为 nil

示例代码

以下代码展示了如何使用Go SDK V2进行文档格式转换,将其转换为需要的输出类型。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string
	bucketName string 
	objectName string
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定需要进行转换的文档名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定转换后的文件名称
	targetKey := "dest.png"

	// 构建文档处理样式字符串以及文档转换处理参数
	animationStyle := "doc/convert,target_png,source_docx" // 定义将源Docx文档转换为PNG图片的处理规则

	// 构建处理指令,包括保存路径和Base64编码的Bucket名称和目标文件名称
	bucketNameEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetKeyEncoded := base64.URLEncoding.EncodeToString([]byte(targetKey))
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify", animationStyle, bucketNameEncoded, targetKeyEncoded)

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		Key:          oss.Ptr(objectName), // 指定要处理的文档名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

常见使用场景

视频转码

您可以使用视频转码功能,修改视频的编码格式、降低分辨率和码率以缩小视频文件体积、转换视频封装格式。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储桶名称
	objectName string // 定义一个变量来保存从命令行获取的对象名称
)

func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定需要进行转码的视频名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储桶名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定转码后的视频名称
	targetObject := "dest.avi"

	// 定义处理风格,这里是一个示例视频转换配置,包括格式、视频编解码器、分辨率、比特率、帧率、音频编解码器、音频比特率等参数
	style := "video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1"

	// 构造异步处理指令,包含处理风格以及处理后文件的保存位置(存储桶和对象名经过Base64编码)
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v",
		style,
		strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="),   // Base64编码存储桶名称并移除末尾的'='
		strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "=")) // Base64编码对象名称并移除末尾的'='

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储桶名称
		Key:          oss.Ptr(objectName), // 指定要处理的视频名称
		AsyncProcess: oss.Ptr(process),
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

视频转动图

您可以通过视频转动图功能,将视频转换为GIF、WebP等格式的动图。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
	objectName string // 定义一个变量来保存从命令行获取的对象名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定要处理的视频名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定处理后GIF动图文件名称
	targetKey := "destexample.gif"

	// 定义视频转GIF动图的参数,包括GIF宽度、高度、间隔帧数等
	animationStyle := "video/animation,f_gif,w_100,h_100,inter_1000"

	// 构建处理指令,包括保存路径和Base64编码的Bucket名称和目标文件名称
	bucketNameEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetKeyEncoded := base64.URLEncoding.EncodeToString([]byte(targetKey))
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", animationStyle, bucketNameEncoded, targetKeyEncoded)

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		Key:          oss.Ptr(objectName), // 指定要处理的视频名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

视频截雪碧图

您可以通过视频截雪碧图功能,提取视频帧并按一定规则拼接为雪碧图。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
	objectName string // 定义一个变量来保存从命令行获取的对象名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定要处理的视频名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定输出的雪碧图文件名称
	targetKey := "example.jpg"

	// 构建视频转雪碧图参数。
	animationStyle := "video/sprite,f_jpg,sw_100,sh_100,inter_10000,tw_10,th_10,pad_0,margin_0"

	// 构建处理指令,包括保存路径和Base64编码的Bucket名和目标文件名
	bucketNameEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetKeyEncoded := base64.URLEncoding.EncodeToString([]byte(targetKey))
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", animationStyle, bucketNameEncoded, targetKeyEncoded)

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		Key:          oss.Ptr(objectName), // 指定要处理的对象名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

视频截帧

您可以通过视频截帧功能,按一定规则提取视频帧并转换为需要的图片格式。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
	objectName string // 定义一个变量来保存从命令行获取的对象名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定要处理的视频名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定按视频截帧处理后的文件名称
	targetKey := "dest.png"

	// 构建视频截帧参数
	animationStyle := "video/snapshots,f_jpg,w_100,h_100,scaletype_crop,inter_10000"

	// 构建处理指令,包括保存路径和Base64编码的Bucket名称和目标文件名称
	bucketNameEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetKeyEncoded := base64.URLEncoding.EncodeToString([]byte(targetKey))
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", animationStyle, bucketNameEncoded, targetKeyEncoded)

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		Key:          oss.Ptr(objectName), // 指定要处理的对象名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

视频拼接

您可以通过视频拼接功能,将多个视频拼接为一个视频并转换为需要的格式。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 填写拼接后的视频文件名称
	targetObject := "dest.mp4"
	// 指定需要拼接的视频文件名称
	video1 := "concat1.mp4"
	video2 := "concat2.mp4"

	// 构建视频处理的样式字符串以及视频拼接处理参数
	style := fmt.Sprintf("video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_%s/sur,o_%s,t_0", strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(video1)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(video2)), "="))
	// 构建异步处理指令
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", style, strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "="))

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

音频转码

您可以通过音频转码功能,将音频转换为需要的格式。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
	objectName string // 定义一个变量来保存从命令行获取的对象名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定需要处理的音频名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定转码后的音频文件
	targetKey := "dest.aac"

	// 构建音频处理样式字符串以及音频转码处理参数。
	animationStyle := "audio/convert,ss_10000,t_60000,f_aac,ab_96000"

	// 构建处理指令,包括保存路径和Base64编码的Bucket名称和目标文件名称。
	bucketNameEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetKeyEncoded := base64.URLEncoding.EncodeToString([]byte(targetKey))
	process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", animationStyle, bucketNameEncoded, targetKeyEncoded)

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		Key:          oss.Ptr(objectName), // 指定需要处理的音频名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

音频拼接

您可以通过音频拼接功能,将多个音频拼接为一个音频并转换为需要的格式。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string // 定义一个变量来保存从命令行获取的区域(Region)信息
	bucketName string // 定义一个变量来保存从命令行获取的存储空间名称
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 需要拼接的音频文件名称。
	audio1 := "src1.mp3"
	audio2 := "src2.mp3"
	// 指定拼接后的音频文件名称。
	targetAudio := "dest.aac"

	// 构建音频处理的样式字符串以及音频拼接处理参数。
	audio1Encoded := base64.URLEncoding.EncodeToString([]byte(audio1))
	audio2Encoded := base64.URLEncoding.EncodeToString([]byte(audio2))
	style := fmt.Sprintf("audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_%s/pre,o_%s,t_0", audio1Encoded, audio2Encoded)

	// 构建异步处理指令。
	bucketEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetEncoded := base64.URLEncoding.EncodeToString([]byte(targetAudio))
	process := fmt.Sprintf("%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0", style, bucketEncoded, targetEncoded)

	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

解析图片盲水印

以下代码展示了如何解析图片中的盲水印。

package main

import (
	"context"
	"encoding/base64"
	"flag"
	"fmt"
	"log"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string
	bucketName string
	objectName string
)

// init函数在main函数之前执行,用来初始化程序
func init() {
	// 设置命令行参数来指定region
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	// 设置命令行参数来指定bucket名称
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	// 设置命令行参数来指定需要处理的图片名称
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端

	// 指定水印图文件名称
	sourceKey := objectName // 指定要处理的图片对象名称

	// 指定MNS消息的topic。
	topic := "imm-blindwatermark-test"

	// 提取指定图片中的水印内容
	style := "image/deblindwatermark,s_low,t_text"
	encodedTopic := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(topic)), "=")
	process := fmt.Sprintf("%s|sys/notify,topic_%s", style, encodedTopic)
	// 构建一个AsyncProcessObject请求,用于发起对特定对象的异步处理
	request := &oss.AsyncProcessObjectRequest{
		Bucket:       oss.Ptr(bucketName), // 指定要操作的存储空间名称
		Key:          oss.Ptr(sourceKey),  // 指定要处理的图片名称
		AsyncProcess: oss.Ptr(process),    
	}

	// 执行请求以异步处理对象,并接收返回结果
	result, err := client.AsyncProcessObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to async process object %v", err)
	}

	log.Printf("async process object result:%#v\n", result)
}

相关文档

  • 本页导读 (1)
  • 注意事项
  • 方法定义
  • 示例代码
  • 常见使用场景
  • 视频转码
  • 视频转动图
  • 视频截雪碧图
  • 视频截帧
  • 视频拼接
  • 音频转码
  • 音频拼接
  • 解析图片盲水印
  • 相关文档