本文提供了直接调用虚拟演播厅OpenAPI的Demo,具体逻辑请根据实际情况自行编写。
虚拟演播厅调用流程
虚拟演播厅整个调用流程顺序如下 :
重要
请先添加视频资源再添加布局,否则布局无法生效。
示例代码
说明
了解API的详细信息,请参见云导播API概览。
使用Go SDK,具体请参见Go SDK使用说明。
创建导播台
// 创建导播台 func CreateCaster(liveClient *live20161101.Client) (*live20161101.CreateCasterResponse, error) { // 创建导播台请求参数 createCasterRequest := &live20161101.CreateCasterRequest{} createCasterRequest.ClientToken = tea.String(uuid.New().String()) createCasterRequest.CasterName = tea.String("导播台测试") createCasterRequest.ChargeType = tea.String("PostPaid") createCasterRequest.NormType = tea.Int32(1) createCasterResponse, err := liveClient.CreateCaster(createCasterRequest) if err != nil { return nil, errors.New("CreateCaster failed: " + err.Error()) } return createCasterResponse, nil }
关于CreateCaster接口的请求参数等更多信息,请参见创建导播台。
设置导播台
// 设置导播台 func SetCasterConfig(liveClient *live20161101.Client, casterId *string, domainName *string) (*live20161101.SetCasterConfigResponse, error) { // 设置导播台配置参数 createSetCasterConfig := &live20161101.SetCasterConfigRequest{} createSetCasterConfig.CasterId = casterId createSetCasterConfig.CasterName = tea.String("导播台测试") createSetCasterConfig.ChannelEnable = tea.Int32(1) createSetCasterConfig.Delay = tea.Float32(0) createSetCasterConfig.DomainName = domainName createSetCasterConfig.ProgramEffect = tea.Int32(1) createSetCasterConfig.ProgramName = tea.String("test loop play") // 转码设置(横竖屏模式及清晰度设置) // 其中:CasterTemplate取值范围如下:lp_ld:流畅、lp_sd:标清、lp_hd:高清、lp_ud:超清。lp_ld_v:竖屏流畅、lp_sd_v:竖屏标清、lp_hd_v:竖屏高清、lp_ud_v:竖屏超清。 createSetCasterConfig.TranscodeConfig = tea.String(`{"CasterTemplate": "lp_ld"}`) // 配置导播台直播录制参数。json字段含义请参考:AddLiveAppRecordConfig // createSetCasterConfig.RecordConfig = tea.String(`{ "endpoint": "", "ossBucket": "", "videoFormat": [{"format": "flv", "interval": 900, "prefix":"record/{AppName}/{StreamName}/{StartTime}_{EndTime}" }]}`) setCasterConfigResponse, err := liveClient.SetCasterConfig(createSetCasterConfig) if err != nil { return nil, errors.New("SetCasterConfig failed: " + err.Error()) } return setCasterConfigResponse, nil }
关于SetCasterConfig接口的更多信息,请参见配置导播台。
添加视频资源
// This file is auto-generated, don't edit it. Thanks. package main import ( "encoding/json" "strings" "fmt" "os" live20161101 "github.com/alibabacloud-go/live-20161101/v2/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" util "github.com/alibabacloud-go/tea-utils/v2/service" credential "github.com/aliyun/credentials-go/credentials" "github.com/alibabacloud-go/tea/tea" ) // Description: // // 使用凭据初始化账号Client // // @return Client // // @throws Exception func CreateClient () (_result *live20161101.Client, _err error) { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378661.html。 credential, _err := credential.NewCredential(nil) if _err != nil { return _result, _err } config := &openapi.Config{ Credential: credential, } // Endpoint 请参考 https://api.aliyun.com/product/live config.Endpoint = tea.String("live.aliyuncs.com") _result = &live20161101.Client{} _result, _err = live20161101.NewClient(config) return _result, _err } func _main (args []*string) (_err error) { client, _err := CreateClient() if _err != nil { return _err } addCasterVideoResourceRequest := &live20161101.AddCasterVideoResourceRequest{ RegionId: tea.String("<Your RegionId>"), CasterId: tea.String("<Your CasterId>"), ResourceName: tea.String("<Your ResourceName>"), LiveStreamUrl: tea.String("<Your LiveStreamUrl>"), MaterialId: tea.String("<Your MaterialId>"), VodUrl: tea.String("<Your VodUrl>"), ImageId: tea.String("<Your ImageId>"), ImageUrl: tea.String("<Your ImageUrl>"), } runtime := &util.RuntimeOptions{} tryErr := func()(_e error) { defer func() { if r := tea.Recover(recover()); r != nil { _e = r } }() // 复制代码运行请自行打印 API 的返回值 _, _err = client.AddCasterVideoResourceWithOptions(addCasterVideoResourceRequest, runtime) if _err != nil { return _err } return nil }() if tryErr != nil { var error = &tea.SDKError{} if _t, ok := tryErr.(*tea.SDKError); ok { error = _t } else { error.Message = tea.String(tryErr.Error()) } // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message fmt.Println(tea.StringValue(error.Message)) // 诊断地址 var data interface{} d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data))) d.Decode(&data) if m, ok := data.(map[string]interface{}); ok { recommend, _ := m["Recommend"] fmt.Println(recommend) } _, _err = util.AssertAsString(error.Message) if _err != nil { return _err } } return _err } func main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { panic(err) } }
关于AddCasterVideoResource接口的更多信息,请参见添加导播台视频资源。
添加虚拟演播厅布局
// This file is auto-generated, don't edit it. Thanks. package main import ( "encoding/json" "strings" "fmt" "os" live20161101 "github.com/alibabacloud-go/live-20161101/v2/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" util "github.com/alibabacloud-go/tea-utils/v2/service" credential "github.com/aliyun/credentials-go/credentials" "github.com/alibabacloud-go/tea/tea" ) // Description: // // 使用凭据初始化账号Client // // @return Client // // @throws Exception func CreateClient () (_result *live20161101.Client, _err error) { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378661.html。 credential, _err := credential.NewCredential(nil) if _err != nil { return _result, _err } config := &openapi.Config{ Credential: credential, } // Endpoint 请参考 https://api.aliyun.com/product/live config.Endpoint = tea.String("live.aliyuncs.com") _result = &live20161101.Client{} _result, _err = live20161101.NewClient(config) return _result, _err } func _main (args []*string) (_err error) { client, _err := CreateClient() if _err != nil { return _err } addStudioLayoutRequest := &live20161101.AddStudioLayoutRequest{ RegionId: tea.String("<Your RegionId>"), CasterId: tea.String("<Your CasterId>"), LayoutName: tea.String("<Your LayoutName>"), LayoutType: tea.String("<Your LayoutType>"), CommonConfig: tea.String("<Your CommonConfig>"), BgImageConfig: tea.String("<Your BgImageConfig>"), ScreenInputConfigList: tea.String("<Your ScreenInputConfigList>"), MediaInputConfigList: tea.String("<Your MediaInputConfigList>"), LayerOrderConfigList: tea.String("<Your LayerOrderConfigList>"), } runtime := &util.RuntimeOptions{} tryErr := func()(_e error) { defer func() { if r := tea.Recover(recover()); r != nil { _e = r } }() // 复制代码运行请自行打印 API 的返回值 _, _err = client.AddStudioLayoutWithOptions(addStudioLayoutRequest, runtime) if _err != nil { return _err } return nil }() if tryErr != nil { var error = &tea.SDKError{} if _t, ok := tryErr.(*tea.SDKError); ok { error = _t } else { error.Message = tea.String(tryErr.Error()) } // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message fmt.Println(tea.StringValue(error.Message)) // 诊断地址 var data interface{} d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data))) d.Decode(&data) if m, ok := data.(map[string]interface{}); ok { recommend, _ := m["Recommend"] fmt.Println(recommend) } _, _err = util.AssertAsString(error.Message) if _err != nil { return _err } } return _err } func main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { panic(err) } }
关于AddStudioLayout接口的更多信息,请参见添加虚拟演播厅布局。
启动导播台、设置播放场景
package caster import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/live" "github.com/go-ini/ini" "testing" "time" ) // 启动导播台、设置播放场景 func StartCaster(t *testing.T) { cfg, err := ini.Load("conf/config.ini") if err != nil { t.Fatal(err) } // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。 // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。 // 本示例通过从配置文件中读取AccessKey,来实现API访问的身份验证。如何配置文件,请参见视频直播 > 开发参考 > SDK参考 > 服务端SDK > Go SDK使用说明。 accessKeyID := cfg.Section("").Key("access_key_id").String() accessKeySecret := cfg.Section("").Key("access_key_secret").String() liveClient, err := live.NewClientWithAccessKey("cn-shanghai", accessKeyID, accessKeySecret) if err != nil { t.Fatal(err) } // 启动导播台 startCasterRequest := live.CreateStartCasterRequest() startCasterRequest.CasterId = "xxx" startCasterResp, err := liveClient.StartCaster(startCasterRequest) if err != nil { t.Fatal(err) } // 因为资源加载需要时间,如果立马启动,则可能资源尚未加载成功,所以需要暂停一下 time.Sleep(time.Second) // 设置播放场景 // PVW (可选设置) setCasterSceneConfigRequest := live.CreateSetCasterSceneConfigRequest() setCasterSceneConfigRequest.LayoutId = "xxx" setCasterSceneConfigRequest.CasterId = "xxx" setCasterSceneConfigRequest.SceneId = startCasterResp.PvwSceneInfos.SceneInfo[0].SceneId _, err = liveClient.SetCasterSceneConfig(setCasterSceneConfigRequest) if err != nil { t.Fatal(err) } // PGM (必选设置) setCasterSceneConfigRequest.SceneId = startCasterResp.PgmSceneInfos.SceneInfo[0].SceneId _, err = liveClient.SetCasterSceneConfig(setCasterSceneConfigRequest) if err != nil { t.Fatal(err) } }
关于StartCaster接口的更多信息,请参见启动导播台。
关于SetCasterSceneConfig接口的更多信息,请参见设置场景配置。
更新导播台场景配置
// This file is auto-generated, don't edit it. Thanks. package main import ( "encoding/json" "strings" "fmt" "os" live20161101 "github.com/alibabacloud-go/live-20161101/v2/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" util "github.com/alibabacloud-go/tea-utils/v2/service" credential "github.com/aliyun/credentials-go/credentials" "github.com/alibabacloud-go/tea/tea" ) // Description: // // 使用凭据初始化账号Client // // @return Client // // @throws Exception func CreateClient () (_result *live20161101.Client, _err error) { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378661.html。 credential, _err := credential.NewCredential(nil) if _err != nil { return _result, _err } config := &openapi.Config{ Credential: credential, } // Endpoint 请参考 https://api.aliyun.com/product/live config.Endpoint = tea.String("live.aliyuncs.com") _result = &live20161101.Client{} _result, _err = live20161101.NewClient(config) return _result, _err } func _main (args []*string) (_err error) { client, _err := CreateClient() if _err != nil { return _err } updateCasterSceneConfigRequest := &live20161101.UpdateCasterSceneConfigRequest{ RegionId: tea.String("<Your RegionId>"), ComponentId: []*string{tea.String("")}, CasterId: tea.String("<Your CasterId>"), SceneId: tea.String("<Your SceneId>"), LayoutId: tea.String("<Your LayoutId>"), } runtime := &util.RuntimeOptions{} tryErr := func()(_e error) { defer func() { if r := tea.Recover(recover()); r != nil { _e = r } }() // 复制代码运行请自行打印 API 的返回值 _, _err = client.UpdateCasterSceneConfigWithOptions(updateCasterSceneConfigRequest, runtime) if _err != nil { return _err } return nil }() if tryErr != nil { var error = &tea.SDKError{} if _t, ok := tryErr.(*tea.SDKError); ok { error = _t } else { error.Message = tea.String(tryErr.Error()) } // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message fmt.Println(tea.StringValue(error.Message)) // 诊断地址 var data interface{} d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data))) d.Decode(&data) if m, ok := data.(map[string]interface{}); ok { recommend, _ := m["Recommend"] fmt.Println(recommend) } _, _err = util.AssertAsString(error.Message) if _err != nil { return _err } } return _err } func main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { panic(err) } }
关于UpdateCasterSceneConfig接口的请求参数等更多信息,请参见更新导播场景配置。
停止导播台
// 停止导播台 func StopCaster(liveClient *live20161101.Client, casterId *string) error { stopCasterRequest := &live20161101.StopCasterRequest{ CasterId: casterId, } _, err := liveClient.StopCaster(stopCasterRequest) if err != nil { return errors.New("StopCaster failed: " + err.Error()) } return nil }
关于StopCaster接口的更多信息,请参见停止导播台。
删除虚拟演播厅布局
// This file is auto-generated, don't edit it. Thanks. package main import ( "encoding/json" "strings" "fmt" "os" live20161101 "github.com/alibabacloud-go/live-20161101/v2/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" util "github.com/alibabacloud-go/tea-utils/v2/service" credential "github.com/aliyun/credentials-go/credentials" "github.com/alibabacloud-go/tea/tea" ) // Description: // // 使用凭据初始化账号Client // // @return Client // // @throws Exception func CreateClient () (_result *live20161101.Client, _err error) { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378661.html。 credential, _err := credential.NewCredential(nil) if _err != nil { return _result, _err } config := &openapi.Config{ Credential: credential, } // Endpoint 请参考 https://api.aliyun.com/product/live config.Endpoint = tea.String("live.aliyuncs.com") _result = &live20161101.Client{} _result, _err = live20161101.NewClient(config) return _result, _err } func _main (args []*string) (_err error) { client, _err := CreateClient() if _err != nil { return _err } deleteStudioLayoutRequest := &live20161101.DeleteStudioLayoutRequest{ RegionId: tea.String("<Your RegionId>"), CasterId: tea.String("<Your CasterId>"), LayoutId: tea.String("<Your LayoutId>"), } runtime := &util.RuntimeOptions{} tryErr := func()(_e error) { defer func() { if r := tea.Recover(recover()); r != nil { _e = r } }() // 复制代码运行请自行打印 API 的返回值 _, _err = client.DeleteStudioLayoutWithOptions(deleteStudioLayoutRequest, runtime) if _err != nil { return _err } return nil }() if tryErr != nil { var error = &tea.SDKError{} if _t, ok := tryErr.(*tea.SDKError); ok { error = _t } else { error.Message = tea.String(tryErr.Error()) } // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message fmt.Println(tea.StringValue(error.Message)) // 诊断地址 var data interface{} d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data))) d.Decode(&data) if m, ok := data.(map[string]interface{}); ok { recommend, _ := m["Recommend"] fmt.Println(recommend) } _, _err = util.AssertAsString(error.Message) if _err != nil { return _err } } return _err } func main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { panic(err) } }
关于DeleteStudioLayout接口的更多信息,请参见删除虚拟演播厅布局。
删除导播台
// 删除导播台 func DeleteCaster(liveClient *live20161101.Client, casterId *string) error { deleteCasterRequest := &live20161101.DeleteCasterRequest{ CasterId: casterId, } _, err := liveClient.DeleteCaster(deleteCasterRequest) if err != nil { return errors.New("DeleteCaster failed: " + err.Error()) } return nil }
关于DeleteCaster接口的更多信息,请参见删除导播台。
修改虚拟演播厅布局
// This file is auto-generated, don't edit it. Thanks. package main import ( "encoding/json" "strings" "fmt" "os" live20161101 "github.com/alibabacloud-go/live-20161101/v2/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" util "github.com/alibabacloud-go/tea-utils/v2/service" credential "github.com/aliyun/credentials-go/credentials" "github.com/alibabacloud-go/tea/tea" ) // Description: // // 使用凭据初始化账号Client // // @return Client // // @throws Exception func CreateClient () (_result *live20161101.Client, _err error) { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378661.html。 credential, _err := credential.NewCredential(nil) if _err != nil { return _result, _err } config := &openapi.Config{ Credential: credential, } // Endpoint 请参考 https://api.aliyun.com/product/live config.Endpoint = tea.String("live.aliyuncs.com") _result = &live20161101.Client{} _result, _err = live20161101.NewClient(config) return _result, _err } func _main (args []*string) (_err error) { client, _err := CreateClient() if _err != nil { return _err } modifyStudioLayoutRequest := &live20161101.ModifyStudioLayoutRequest{ RegionId: tea.String("<Your RegionId>"), CasterId: tea.String("<Your CasterId>"), LayoutId: tea.String("<Your LayoutId>"), LayoutName: tea.String("<Your LayoutName>"), CommonConfig: tea.String("<Your CommonConfig>"), BgImageConfig: tea.String("<Your BgImageConfig>"), ScreenInputConfigList: tea.String("<Your ScreenInputConfigList>"), MediaInputConfigList: tea.String("<Your MediaInputConfigList>"), LayerOrderConfigList: tea.String("<Your LayerOrderConfigList>"), } runtime := &util.RuntimeOptions{} tryErr := func()(_e error) { defer func() { if r := tea.Recover(recover()); r != nil { _e = r } }() // 复制代码运行请自行打印 API 的返回值 _, _err = client.ModifyStudioLayoutWithOptions(modifyStudioLayoutRequest, runtime) if _err != nil { return _err } return nil }() if tryErr != nil { var error = &tea.SDKError{} if _t, ok := tryErr.(*tea.SDKError); ok { error = _t } else { error.Message = tea.String(tryErr.Error()) } // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message fmt.Println(tea.StringValue(error.Message)) // 诊断地址 var data interface{} d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data))) d.Decode(&data) if m, ok := data.(map[string]interface{}); ok { recommend, _ := m["Recommend"] fmt.Println(recommend) } _, _err = util.AssertAsString(error.Message) if _err != nil { return _err } } return _err } func main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { panic(err) } }
关于ModifyStudioLayout接口的相关信息,请参见修改虚拟演播厅布局。
查询虚拟演播厅布局
// This file is auto-generated, don't edit it. Thanks. package main import ( "encoding/json" "strings" "fmt" "os" live20161101 "github.com/alibabacloud-go/live-20161101/v2/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" util "github.com/alibabacloud-go/tea-utils/v2/service" credential "github.com/aliyun/credentials-go/credentials" "github.com/alibabacloud-go/tea/tea" ) // Description: // // 使用凭据初始化账号Client // // @return Client // // @throws Exception func CreateClient () (_result *live20161101.Client, _err error) { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378661.html。 credential, _err := credential.NewCredential(nil) if _err != nil { return _result, _err } config := &openapi.Config{ Credential: credential, } // Endpoint 请参考 https://api.aliyun.com/product/live config.Endpoint = tea.String("live.aliyuncs.com") _result = &live20161101.Client{} _result, _err = live20161101.NewClient(config) return _result, _err } func _main (args []*string) (_err error) { client, _err := CreateClient() if _err != nil { return _err } describeStudioLayoutsRequest := &live20161101.DescribeStudioLayoutsRequest{ RegionId: tea.String("<Your RegionId>"), } runtime := &util.RuntimeOptions{} tryErr := func()(_e error) { defer func() { if r := tea.Recover(recover()); r != nil { _e = r } }() // 复制代码运行请自行打印 API 的返回值 _, _err = client.DescribeStudioLayoutsWithOptions(describeStudioLayoutsRequest, runtime) if _err != nil { return _err } return nil }() if tryErr != nil { var error = &tea.SDKError{} if _t, ok := tryErr.(*tea.SDKError); ok { error = _t } else { error.Message = tea.String(tryErr.Error()) } // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message fmt.Println(tea.StringValue(error.Message)) // 诊断地址 var data interface{} d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data))) d.Decode(&data) if m, ok := data.(map[string]interface{}); ok { recommend, _ := m["Recommend"] fmt.Println(recommend) } _, _err = util.AssertAsString(error.Message) if _err != nil { return _err } } return _err } func main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { panic(err) } }
关于DescribeStudioLayouts接口的相关信息,请参见接口的相关信息,请参见查询虚拟演播厅布局。
该文章对您有帮助吗?