# README
云端转码服务
服务简介
声网的云端转码服务是专为实时互动产品中的直播场景而开发。云端转码服务允许你在服务器端获取 RTC 频道中主播的音视频源流,并对其进行转码、混音、合图等音视频处理,最后将处理后的音视频流发布到声网的 RTC 频道,供观众端订阅。通过使用云端转码服务,观众无需订阅多个主播的音视频流,从而减轻了下行带宽压力和客户端设备的性能消耗。
环境准备
-
获取声网App ID -------- 声网Agora - 文档中心 - 如何获取 App ID
-
点击创建应用
-
选择你要创建的应用类型
-
-
获取App 证书 ----- 声网Agora - 文档中心 - 获取 App 证书
在声网控制台的项目管理页面,找到你的项目,点击配置。
点击主要证书下面的复制图标,即可获取项目的 App 证书。
-
开启云端转码服务 请联系声网技术支持
API V1 接口调用示例
获取云端转码资源
在开始创建云端转码之前,你需要调用 acquire 方法获取一个 tokenName。一个 builderToken 仅可用于一次云端转码任务。
需要设置的参数有:
- appId: 声网的项目 AppID
- username: 声网的Basic Auth认证的用户名
- password: 声网的Basic Auth认证的密码
- instanceId: 用户指定的实例 ID
通过调用Acquire().Do
方法来实现获取云端转码资源
ctx := context.Background()
c := core.NewClient(&core.Config{
AppID: appId,
Credential: core.NewBasicAuthCredential(username, password),
RegionCode: core.CN,
Logger: core.NewDefaultLogger(core.LogDebug),
})
v1Impl := cloudtranscoder.NewAPI(c).V1()
acquireResp, err := v1Impl.Acquire().Do(ctx, &v1.AcquireReqBody{
InstanceId: instanceId,
})
if err != nil {
log.Fatalln(err)
}
if acquireResp.IsSuccess() {
log.Printf("acquire success:%+v\n", acquireResp)
} else {
log.Fatalf("acquire failed:%+v\n", acquireResp)
}
开启云端转码
通过 acquire 方法获取云端转码资源后,调用 create 方法开始云端转码。
需要设置的参数有:
- builderToken: 通过 acquire 方法获取的 tokenName
- 更多 Body中的参数见Create接口文档
通过调用Create().Do
方法来实现创建云端转码
createResp, err := v1Impl.Create().Do(ctx, tokenName, &v1.CreateReqBody{
Services: &v1.CreateReqServices{
CloudTranscoder: &v1.CloudTranscoderPayload{
ServiceType: "cloudTranscoderV2",
Config: &v1.CloudTranscoderConfig{
Transcoder: &v1.CloudTranscoderConfigPayload{
IdleTimeout: 300,
AudioInputs: []v1.CloudTranscoderAudioInput{
{
Rtc: &v1.CloudTranscoderRtc{
RtcChannel: "test-abc",
RtcUID: 123,
RtcToken: "xxxxxx",
},
},
},
Outputs: []v1.CloudTranscoderOutput{
{
Rtc: &v1.CloudTranscoderRtc{
RtcChannel: "test-efg",
RtcUID: 456,
RtcToken: "xxxxx",
},
AudioOption: &v1.CloudTranscoderOutputAudioOption{
ProfileType: "AUDIO_PROFILE_MUSIC_STANDARD",
},
},
},
},
},
},
},
})
if err != nil {
log.Fatalln(err)
}
if createResp.IsSuccess() {
log.Printf("create success:%+v\n", createResp)
} else {
log.Printf("create failed:%+v\n", createResp)
return
}
查询云端转码
开始云端转码后,你可以调用 query 方法查询云端转码状态。
需要设置的参数有:
- taskId: 从 Create 方法获取到的 taskId
- builderToken: 通过 acquire 方法获取的 tokenName
通过调用Query().Do
方法来实现查询云端转码状态:
queryResp, err := v1Impl.Query().Do(ctx, taskId, tokenName)
if err != nil {
log.Println(err)
return
}
if queryResp.IsSuccess() {
log.Printf("query success:%+v\n", queryResp)
} else {
log.Printf("query failed:%+v\n", queryResp)
return
}
更新云端转码
开始云端转码后,你可以调用 update 方法更新云端转码状态。
需要设置的参数有:
-
taskId: 从 Create 方法获取到的 taskId
-
builderToken: 通过 acquire 方法获取的 tokenName
-
sequenceId: Update 请求的序列号。取值需要大于或等于 0。请确保后一次 Update 请求的序列号大于前一次 Update 请求的序列号。序列号可以确保声网服务器按照你指定的最新配置来更新 cloud transcoder。
-
更多 Body中的参数见Update接口文档
通过调用Update().Do
方法来实现更新云端转码
updateResp, err := v1Impl.Update().Do(ctx, taskId, tokenName, 1, &v1.UpdateReqBody{
Services: &v1.CreateReqServices{
CloudTranscoder: &v1.CloudTranscoderPayload{
ServiceType: "cloudTranscoderV2",
Config: &v1.CloudTranscoderConfig{
Transcoder: &v1.CloudTranscoderConfigPayload{
IdleTimeout: 300,
AudioInputs: []v1.CloudTranscoderAudioInput{
{
Rtc: &v1.CloudTranscoderRtc{
RtcChannel: "test-abc",
RtcUID: 123,
RtcToken: "xxxxxx",
},
},
},
Outputs: []v1.CloudTranscoderOutput{
{
Rtc: &v1.CloudTranscoderRtc{
RtcChannel: "test-efg",
RtcUID: 456,
RtcToken: "xxxxx",
},
AudioOption: &v1.CloudTranscoderOutputAudioOption{
ProfileType: "AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO",
},
},
},
},
},
},
},
})
if err != nil {
log.Println(err)
return
}
if updateResp.IsSuccess() {
log.Printf("update success:%+v\n", updateResp)
} else {
log.Printf("update failed:%+v\n", updateResp)
return
}
停止云端转码
如果你不再需要云端转码,你可以发起 Delete 请求销毁。
需要设置的参数有:
- taskId: 从 Create 方法获取到的 taskId
- builderToken: 通过 acquire 方法获取的 tokenName
通过调用Delete().Do
方法来实现停止云端转码
deleteResp, err := v1Impl.Delete().Do(ctx, taskId, tokenName)
if err != nil {
log.Println(err)
return
}
if deleteResp.IsSuccess() {
log.Printf("delete success:%+v\n", deleteResp)
} else {
log.Printf("delete failed:%+v\n", deleteResp)
return
}
错误码和响应状态码处理
具体的业务响应码请参考响应状态码文档