视频加密

最近更新时间:2025-06-17 20:27:42

我的收藏

简介

本文档提供关于视频加密的相关 API 概览以及 SDK 示例代码。
API
操作描述
提交一个视频加密转码任务。

生成视频加密转码任务

方法原型

func (s *CIService) CreateJob(ctx context.Context, opt *CreateJobsOptions) (*CreateJobsResult, *Response, error)

参数说明

请参见 API文档 中参数说明,与 SDK 字段一一对应。

请求示例

// 将 examplebucket-1250000000 和 COS_REGION 修改为真实的信息
bu, _ := url.Parse("https://examplebucket-1250000000.cos.COS_REGION.myqcloud.com")
cu, _ := url.Parse("https://examplebucket-1250000000.ci.COS_REGION.myqcloud.com")
b := &cos.BaseURL{BucketURL: bu, CIURL: cu}
c := cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: os.Getenv("SECRETID"),
SecretKey: os.Getenv("SECRETKEY"),
},
})

createJobOpt := &cos.CreateJobsOptions{
Tag: "Transcode",
Input: &cos.JobInput{
Object: "input/test.mp4",
},
Operation: &cos.MediaProcessJobOperation{
Output: &cos.JobOutput{
Region: "ap-chongqing",
Object: "output/test",
Bucket: "test-1234567890",
},
Transcode: &cos.Transcode{
Container: &cos.Container{
Format: "hls",
},
Video: &cos.Video{
Codec: "H.264",
},
Audio: &cos.Audio{
Codec: "AAC",
},
TimeInterval: &cos.TimeInterval{
Start: "10",
Duration: "",
},
TransConfig: &cos.TransConfig{
HlsEncrypt: &cos.HlsEncrypt{
IsHlsEncrypt: true,
},
},
},
UserData: "hello world",
},
}
createJobRes, _, err := c.CI.CreateJob(context.Background(), createJobOpt)
log_status(err)
fmt.Printf("%+v\\n", createJobRes.JobsDetail)

获取加密视频播放地址

type URLToken struct {
SessionToken string `url:"x-cos-security-token,omitempty" header:"-"`
}

type JwtTokens struct {
// base info
Type string `json:"Type"`
AppId string `json:"AppId"`
BucketId string `json:"BucketId"`
Object string `json:"Object"`
Issuer string `json:"Issuer"`
// time info
IssuedTimeStamp int64 `json:"IssuedTimeStamp"`
ExpireTimeStamp int64 `json:"ExpireTimeStamp"`
// other info
Random int64 `json:"Random"`
// times info
UsageLimit int `json:"UsageLimit"`
// secret info
ProtectSchema string `json:"ProtectSchema"`
PublicKey string `json:"PublicKey"`
ProtectContentKey int `json:"ProtectContentKey"`
}
func (token JwtTokens) Valid() error {
return nil
}
// 生成jwt
func GenerateToken(appId string, bucketId string, objectKey string, secret []byte) (string, error) {
t := time.Now()
now := t.Unix()
payLoad := JwtTokens{
// 固定为 CosCiToken, 必填参数
Type: "CosCiToken",
// app id,必填参数
AppId: appId,
// 播放文件所在的 BucketId, 必填参数
BucketId: bucketId,
// 播放文件名
Object: url.QueryEscape(objectKey),
// 固定为 client,必填参数
Issuer: "client",
// token 颁发时间戳,必填参数
IssuedTimeStamp: now,
// token 过期时间戳,非必填参数,默认1天过期
ExpireTimeStamp: t.Add(time.Hour * 24 * 6).Unix(),
// token使用次数限制,非必填参数,默认限制100次
UsageLimit: 20,
// 保护模式,填写为 rsa1024,则表示使用 RSA 非对称加密的方式保护,公私钥对长度为1024 bit
ProtectSchema: "rsa1024",
// 公钥。1024 bit 的 RSA 公钥,需使用 Base64 进行编码
PublicKey: "xxx",
// 是否加密解密密钥(播放时解密ts视频流的密钥),1表示对解密密钥加密,0表示不对解密密钥加密。
ProtectContentKey: 0,
}
//使用指定的签名方法创建签名对象
token := jwt.NewWithClaims(jwt.SigningMethodHS256, payLoad)
//使用指定的 secret 签名并获得完成的编码后的字符串 token
return token.SignedString(secret)
}
// COS环境
func GetCOSDomainVideoEncryptionURL(tak string, tsk string, token *URLToken, bucketId string, region string, objectKey string, jwtToken string) string {
u, _ := url.Parse("https://" + bucketId + ".cos." + region + ".myqcloud.com")
b := &cos.BaseURL{BucketURL: u}
c := cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: tak,
SecretKey: tsk,
SessionToken: token.SessionToken,
},
})
ctx := context.Background()

opt := &cos.PresignedURLOptions{
Query: &url.Values{},
Header: &http.Header{},
}
opt.Query.Add("ci-process", "pm3u8")
opt.Query.Add("signType", "cos")
opt.Query.Add("expires", "43200")
// opt.Query.Add("exper", "30") 试看时长
opt.Query.Add("tokenType", "JwtToken")
opt.Query.Add("token", jwtToken)

var signHost bool = true
// 获取预签名
presignedURL, err := c.Object.GetPresignedURL2(ctx, http.MethodGet, objectKey, 10*time.Hour, opt, signHost)
if err != nil {
fmt.Printf("Error: %v\\n", err)
return ""
}
resultUrl := presignedURL.String()
return resultUrl
}

// CDN 域名
func GetCDNDomainVideoEncryptionURL(cdn string, objectKey string, jwtToken string) string {
url := cdn + "/" + objectKey
resultUrl := url + "?ci-process=pm3u8&signType=no&expires=43200&&tokenType=JwtToken&token=" + jwtToken
return resultUrl
}

func main() {
// 替换成您的密钥
tak := os.Getenv("COS_SECRETID")
tsk := os.Getenv("COS_SECRETKEY")
token := &URLToken{
SessionToken: "",
}
// 替换成您的桶名称
appId := "1250000000"
// 替换成您的桶名称
bucketId := "test-1250000000"
// 替换成您桶所在的 region
region := "ap-chongqing"
// 替换成您需要播放的视频名称
objectKey := "live/a.m3u8"
// 替换为自己 cdn 域名
cdn := "http://abc.cdn.com"

// 替换为自己播放密钥,控制台可以查询
var playkey = []byte("aaaaaaaaaaa")
// 生成 token
jwtToken, _ := GenerateToken(appId, bucketId, objectKey, playkey)
playUrl := ""
playUrl = GetCOSDomainVideoEncryptionURL(tak, tsk, token, bucketId, region, objectKey, jwtToken)
fmt.Println(playUrl)
playUrl = GetCDNDomainVideoEncryptionURL(cdn, objectKey, jwtToken)
fmt.Println(playUrl)
}

播放地址使用

请参见 COS 音视频播放器概述 选择合适的方式。

SDK 代码完整示例

请参见 go-sdk 获取完整示例。
注意:
执行代码前建议执行以下命令安装最新的第三方依赖库:
go get -u github.com/golang-jwt/jwt/v5