虚拟演播厅API调用Demo

本文提供了直接调用虚拟演播厅OpenAPIDemo,具体逻辑请根据实际情况自行编写。

虚拟演播厅调用流程

虚拟演播厅整个调用流程顺序如下 :

重要

请先添加视频资源再添加布局,否则布局无法生效。

  1. 创建导播台

  2. 设置导播台

  3. 添加视频资源

  4. 添加虚拟演播厅布局

  5. 启动导播台

  6. 更新导播台场景配置

  7. 停止导播台

  8. 删除虚拟演播厅布局

  9. 删除导播台

示例代码

说明
  • 创建导播台

    // 创建导播台
    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 IDAccessKey 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接口的相关信息,请参见接口的相关信息,请参见查询虚拟演播厅布局