通用型导播台API调用Demo

2025-12-10 01:29:22

示例代码说明 了解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接口的更多信息,请参见配置导播台。

添加资源及绑定到通道

// 添加资源

func AddCasterVideoResource(liveClient *live20161101.Client, casterId *string) error {

// 创建导播台视频资源

addCasterVideoResourceRequest := &live20161101.AddCasterVideoResourceRequest{}

addCasterVideoResourceRequest.CasterId = casterId

addCasterVideoResourceRequest.ResourceName = tea.String("测试使用视频资源")

addCasterVideoResourceRequest.LiveStreamUrl = tea.String("xxxxx")

addCasterVideoResourceRequest.PtsCallbackInterval = tea.Int32(1000)

addCasterVideoResourceResp, err := liveClient.AddCasterVideoResource(addCasterVideoResourceRequest)

if err != nil {

return errors.New("AddCasterVideoResource failed: " + err.Error())

}

resourceId := addCasterVideoResourceResp.Body.ResourceId

// 视频资源与通道一一绑定

setCasterChannelRequest := &live20161101.SetCasterChannelRequest{}

setCasterChannelRequest.CasterId = casterId

setCasterChannelRequest.PlayStatus = tea.Int32(1)

setCasterChannelRequest.ChannelId = tea.String("RV01")

setCasterChannelRequest.ResourceId = resourceId

_, err = liveClient.SetCasterChannel(setCasterChannelRequest)

if err != nil {

return errors.New("SetCasterChannel failed: " + err.Error())

}

return nil

}关于AddCasterVideoResource接口的更多信息,请参见添加导播台视频资源。

添加布局

// 添加布局

func AddCasterLayout(liveClient *live20161101.Client, casterId *string) (*live20161101.AddCasterLayoutResponse, error) {

// 创建布局

addCasterLayoutRequest := &live20161101.AddCasterLayoutRequest{}

addCasterLayoutRequest.CasterId = casterId

addCasterLayoutRequest.BlendList = []*string{tea.String("RV01")} // 对应于视频的位置

addCasterLayoutRequest.MixList = []*string{tea.String("RV01")} // 对应于视频的位置

audioLayer := &live20161101.AddCasterLayoutRequestAudioLayer{}

audioLayer.VolumeRate = tea.Float32(1)

audioLayer.ValidChannel = tea.String("all")

audioLayer.FixedDelayDuration = tea.Int32(0)

addCasterLayoutRequest.AudioLayer = []*live20161101.AddCasterLayoutRequestAudioLayer{

audioLayer,

}

videoLayer := &live20161101.AddCasterLayoutRequestVideoLayer{

FillMode: tea.String("fit"),

HeightNormalized: tea.Float32(1),

WidthNormalized: tea.Float32(1),

PositionRefer: tea.String("topLeft"),

PositionNormalized: []*float32{tea.Float32(0), tea.Float32(0)},

FixedDelayDuration: tea.Int32(0),

}

addCasterLayoutRequest.VideoLayer = []*live20161101.AddCasterLayoutRequestVideoLayer{

videoLayer,

}

addCasterLayoutResponse, err := liveClient.AddCasterLayout(addCasterLayoutRequest)

if err != nil {

return nil, errors.New("AddCasterLayout failed: " + err.Error())

}

return addCasterLayoutResponse, nil

}关于AddCasterLayout接口的更多信息,请参见添加导播台布局。

启动导播台、设置播放场景

// 启动导播台、设置播放场景

func StartCaster(liveClient *live20161101.Client, casterId *string, layoutId *string) (*live20161101.StartCasterResponse, error) {

// 启动导播台

startCasterRequest := &live20161101.StartCasterRequest{

CasterId: casterId,

}

startCasterResp, err := liveClient.StartCaster(startCasterRequest)

if err != nil {

return nil, errors.New("StartCaster failed: " + err.Error())

}

// 因为资源加载需要时间,如果立马启动,则可能资源尚未加载成功,所以需要暂停一下

time.Sleep(time.Second)

// 设置播放场景

// PVW (可选设置)

setCasterSceneConfigRequest := &live20161101.SetCasterSceneConfigRequest{

CasterId: casterId,

LayoutId: layoutId,

SceneId: startCasterResp.Body.PvwSceneInfos.SceneInfo[0].SceneId,

}

_, err = liveClient.SetCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return nil, errors.New("SetCasterSceneConfig failed: " + err.Error())

}

// PGM (必选设置)

setCasterSceneConfigRequest.SceneId = startCasterResp.Body.PgmSceneInfos.SceneInfo[0].SceneId

_, err = liveClient.SetCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return nil, errors.New("SetCasterSceneConfig failed: " + err.Error())

}

return startCasterResp, nil

}关于StartCaster接口的更多信息,请参见启动导播台。

关于SetCasterSceneConfig接口的更多信息,请参见设置场景配置。

添加ET字幕组件并应用到场景

// 添加ET字幕组件并应用到场景

func AddETComponent(liveClient *live20161101.Client, casterId *string, layoutId *string, pgmSceneId *string) error {

// 此方法前提: 导播台已经存在,且添加的视频资源是直播流,且locationID是RV01

// 注:ET字幕必须是直播流才有效

// 创建组件

r := &live20161101.AddCasterComponentRequest{

CasterId: casterId,

ComponentType: tea.String("caption"),

ComponentName: tea.String("ET字幕测试使用"),

Effect: tea.String("none"),

LocationId: tea.String("RV01"),

ComponentLayer: tea.String(`{"HeightNormalized":"1","WidthNormalized":"1","PositionRefer":"topLeft","PositionNormalized":["0.05", "0.7"]}`),

// 字幕具体字段请参考:AddCasterComponent文档内的【CaptionLayerContent】字段说明

// 其中新增以下字段,目前官网文档尚未更新,请注意

// BoxWidthNormalized:文字背景宽度归一化值,该归一化值是基于文字的size来计算的,即boxWidth/font_size, 如果系统归一化反计算出来的值超过16,取16. 默认0。

// BoxColor:文字背景色彩,取值格式为 0xRGBA,比如: 取值"0xff0000ff" 表示红色, 不透明; 默认"" 表示无效。

// ShadowxWidthNormalized:文字阴影x坐标归一化值,该归一化值是基于文字的size来计算的,即shadowxWidth/font_size, 如果系统归一化反计算出来的值超过16,取16. 默认0。

// ShadowyWidthNormalized:文字阴影y坐标归一化值,该归一化值是基于文字的size来计算的,即shadowyWidth/font_size, 如果系统归一化反计算出来的值超过16,取16. 默认0。

// ShadowColor:文字阴影色彩,取值格式为 0xRGBA,比如: 取值"0xff0000ff" 表示红色, 不透明; 默认"" 表示无效。

CaptionLayerContent: tea.String(`{

"SizeNormalized": 0.05,

"Color": "0xFFFFFF",

"LocationId": "RV01",

"BorderColor": "0x696969",

"BorderWidthNormalized": 0.1,

"BoxColor": "0xffffff",

"BoxWidthNormalized": 0.7,

"ShadowColor": "0x3c3c3c",

"ShadowxWidthNormalized": 0.4,

"ShadowyWidthNormalized": 0.4,

"SourceLan": "cn",

"TargetLan": "en",

"PtsOffset": -1000,

"SourceLanPerLineWordCount": 28,

"TargetLanPerLineWordCount": 60,

"ShowSourceLan": true,

"ShowTargetLan": true,

"Truncation": false,

"AppearDuration": 20000,

"AppearMode": "Movie"

}`),

}

addCasterComponentResp, err := liveClient.AddCasterComponent(r)

if err != nil {

return errors.New("AddCasterComponent failed: " + err.Error())

}

// 应用组件到指定的场景下

setCasterSceneConfigRequest := &live20161101.UpdateCasterSceneConfigRequest{

CasterId: casterId,

LayoutId: layoutId,

SceneId: pgmSceneId,

ComponentId: []*string{addCasterComponentResp.Body.ComponentId},

}

_, err = liveClient.UpdateCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return errors.New("UpdateCasterSceneConfig failed: " + err.Error())

}

return nil

}关于AddCasterComponent接口的更多信息,请参见添加导播台组件。

关于SetCasterSceneConfig接口的更多信息,请参见设置场景配置。

切换布局

// 切换布局

func ChangeLayout(liveClient *live20161101.Client, casterId *string, pgmSceneId *string, newLayoutId *string) error {

// 更改场景使用的布局ID

setCasterSceneConfigRequest := &live20161101.UpdateCasterSceneConfigRequest{

CasterId: casterId,

SceneId: pgmSceneId,

LayoutId: newLayoutId,

}

_, err := liveClient.UpdateCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return errors.New("UpdateCasterSceneConfig failed: " + err.Error())

}

return nil

}关于SetCasterSceneConfig接口的更多信息,请参见设置场景配置。

停止导播台

// 停止导播台

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接口的更多信息,请参见停止导播台。

删除导播台

// 删除导播台

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接口的更多信息,请参见删除导播台。

package main

import (

"errors"

"log"

"sync"

"time"

openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"

live20161101 "github.com/alibabacloud-go/live-20161101/v2/client"

"github.com/alibabacloud-go/tea/tea"

"github.com/google/uuid"

"gopkg.in/ini.v1"

)

type LiveClient struct {

instance *live20161101.Client

once sync.Once

}

var liveClientInstance = &LiveClient{}

func GetClientInstance() (*live20161101.Client, error) {

section, err := getAccessKey()

if err != nil {

return nil, err

}

liveClientInstance.once.Do(func() {

cfg := &openapi.Config{

Endpoint: tea.String("live.aliyuncs.com"),

AccessKeyId: tea.String(section.Key("access_key_id").String()),

AccessKeySecret: tea.String(section.Key("access_key_secret").String()),

}

liveClientInstance.instance, err = live20161101.NewClient(cfg)

if err != nil {

err = errors.New("Live client initialization failed: " + err.Error())

}

})

if err != nil {

return nil, err

}

return liveClientInstance.instance, nil

}

func getAccessKey() (*ini.Section, error) {

cfg, err := ini.Load("conf/config.ini")

if err != nil {

return nil, errors.New("ERROR: Can not open file " + err.Error())

}

section, err := cfg.GetSection("")

if err != nil {

return nil, errors.New("ERROR: Can not find section " + err.Error())

}

return section, nil

}

// 创建导播台

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

}

// 设置导播台

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

}

// 添加资源

func AddCasterVideoResource(liveClient *live20161101.Client, casterId *string) error {

// 创建导播台视频资源

addCasterVideoResourceRequest := &live20161101.AddCasterVideoResourceRequest{}

addCasterVideoResourceRequest.CasterId = casterId

addCasterVideoResourceRequest.ResourceName = tea.String("测试使用视频资源")

addCasterVideoResourceRequest.LiveStreamUrl = tea.String("xxxxx")

addCasterVideoResourceRequest.PtsCallbackInterval = tea.Int32(1000)

addCasterVideoResourceResp, err := liveClient.AddCasterVideoResource(addCasterVideoResourceRequest)

if err != nil {

return errors.New("AddCasterVideoResource failed: " + err.Error())

}

resourceId := addCasterVideoResourceResp.Body.ResourceId

// 视频资源与通道一一绑定

setCasterChannelRequest := &live20161101.SetCasterChannelRequest{}

setCasterChannelRequest.CasterId = casterId

setCasterChannelRequest.PlayStatus = tea.Int32(1)

setCasterChannelRequest.ChannelId = tea.String("RV01")

setCasterChannelRequest.ResourceId = resourceId

_, err = liveClient.SetCasterChannel(setCasterChannelRequest)

if err != nil {

return errors.New("SetCasterChannel failed: " + err.Error())

}

return nil

}

// 添加布局

func AddCasterLayout(liveClient *live20161101.Client, casterId *string) (*live20161101.AddCasterLayoutResponse, error) {

// 创建布局

addCasterLayoutRequest := &live20161101.AddCasterLayoutRequest{}

addCasterLayoutRequest.CasterId = casterId

addCasterLayoutRequest.BlendList = []*string{tea.String("RV01")} // 对应于视频的位置

addCasterLayoutRequest.MixList = []*string{tea.String("RV01")} // 对应于视频的位置

audioLayer := &live20161101.AddCasterLayoutRequestAudioLayer{}

audioLayer.VolumeRate = tea.Float32(1)

audioLayer.ValidChannel = tea.String("all")

audioLayer.FixedDelayDuration = tea.Int32(0)

addCasterLayoutRequest.AudioLayer = []*live20161101.AddCasterLayoutRequestAudioLayer{

audioLayer,

}

videoLayer := &live20161101.AddCasterLayoutRequestVideoLayer{

FillMode: tea.String("fit"),

HeightNormalized: tea.Float32(1),

WidthNormalized: tea.Float32(1),

PositionRefer: tea.String("topLeft"),

PositionNormalized: []*float32{tea.Float32(0), tea.Float32(0)},

FixedDelayDuration: tea.Int32(0),

}

addCasterLayoutRequest.VideoLayer = []*live20161101.AddCasterLayoutRequestVideoLayer{

videoLayer,

}

addCasterLayoutResponse, err := liveClient.AddCasterLayout(addCasterLayoutRequest)

if err != nil {

return nil, errors.New("AddCasterLayout failed: " + err.Error())

}

return addCasterLayoutResponse, nil

}

// 添加ET字幕组件并应用到场景

func AddETComponent(liveClient *live20161101.Client, casterId *string, layoutId *string, pgmSceneId *string) error {

// 此方法前提: 导播台已经存在,且添加的视频资源是直播流,且locationID是RV01

// 注:ET字幕必须是直播流才有效

// 创建组件

r := &live20161101.AddCasterComponentRequest{

CasterId: casterId,

ComponentType: tea.String("caption"),

ComponentName: tea.String("ET字幕测试使用"),

Effect: tea.String("none"),

LocationId: tea.String("RV01"),

ComponentLayer: tea.String(`{"HeightNormalized":"1","WidthNormalized":"1","PositionRefer":"topLeft","PositionNormalized":["0.05", "0.7"]}`),

// 字幕具体字段请参考:AddCasterComponent文档内的【CaptionLayerContent】字段说明

// 其中新增以下字段,目前官网文档尚未更新,请注意

// BoxWidthNormalized:文字背景宽度归一化值,该归一化值是基于文字的size来计算的,即boxWidth/font_size, 如果系统归一化反计算出来的值超过16,取16. 默认0。

// BoxColor:文字背景色彩,取值格式为 0xRGBA,比如: 取值"0xff0000ff" 表示红色, 不透明; 默认"" 表示无效。

// ShadowxWidthNormalized:文字阴影x坐标归一化值,该归一化值是基于文字的size来计算的,即shadowxWidth/font_size, 如果系统归一化反计算出来的值超过16,取16. 默认0。

// ShadowyWidthNormalized:文字阴影y坐标归一化值,该归一化值是基于文字的size来计算的,即shadowyWidth/font_size, 如果系统归一化反计算出来的值超过16,取16. 默认0。

// ShadowColor:文字阴影色彩,取值格式为 0xRGBA,比如: 取值"0xff0000ff" 表示红色, 不透明; 默认"" 表示无效。

CaptionLayerContent: tea.String(`{

"SizeNormalized": 0.05,

"Color": "0xFFFFFF",

"LocationId": "RV01",

"BorderColor": "0x696969",

"BorderWidthNormalized": 0.1,

"BoxColor": "0xffffff",

"BoxWidthNormalized": 0.7,

"ShadowColor": "0x3c3c3c",

"ShadowxWidthNormalized": 0.4,

"ShadowyWidthNormalized": 0.4,

"SourceLan": "cn",

"TargetLan": "en",

"PtsOffset": -1000,

"SourceLanPerLineWordCount": 28,

"TargetLanPerLineWordCount": 60,

"ShowSourceLan": true,

"ShowTargetLan": true,

"Truncation": false,

"AppearDuration": 20000,

"AppearMode": "Movie"

}`),

}

addCasterComponentResp, err := liveClient.AddCasterComponent(r)

if err != nil {

return errors.New("AddCasterComponent failed: " + err.Error())

}

// 应用组件到指定的场景下

setCasterSceneConfigRequest := &live20161101.UpdateCasterSceneConfigRequest{

CasterId: casterId,

LayoutId: layoutId,

SceneId: pgmSceneId,

ComponentId: []*string{addCasterComponentResp.Body.ComponentId},

}

_, err = liveClient.UpdateCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return errors.New("UpdateCasterSceneConfig failed: " + err.Error())

}

return nil

}

// 启动导播台、设置播放场景

func StartCaster(liveClient *live20161101.Client, casterId *string, layoutId *string) (*live20161101.StartCasterResponse, error) {

// 启动导播台

startCasterRequest := &live20161101.StartCasterRequest{

CasterId: casterId,

}

startCasterResp, err := liveClient.StartCaster(startCasterRequest)

if err != nil {

return nil, errors.New("StartCaster failed: " + err.Error())

}

// 因为资源加载需要时间,如果立马启动,则可能资源尚未加载成功,所以需要暂停一下

time.Sleep(time.Second)

// 设置播放场景

// PVW (可选设置)

setCasterSceneConfigRequest := &live20161101.SetCasterSceneConfigRequest{

CasterId: casterId,

LayoutId: layoutId,

SceneId: startCasterResp.Body.PvwSceneInfos.SceneInfo[0].SceneId,

}

_, err = liveClient.SetCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return nil, errors.New("SetCasterSceneConfig failed: " + err.Error())

}

// PGM (必选设置)

setCasterSceneConfigRequest.SceneId = startCasterResp.Body.PgmSceneInfos.SceneInfo[0].SceneId

_, err = liveClient.SetCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return nil, errors.New("SetCasterSceneConfig failed: " + err.Error())

}

return startCasterResp, nil

}

// 切换布局

func ChangeLayout(liveClient *live20161101.Client, casterId *string, pgmSceneId *string, newLayoutId *string) error {

// 更改场景使用的布局ID

setCasterSceneConfigRequest := &live20161101.UpdateCasterSceneConfigRequest{

CasterId: casterId,

SceneId: pgmSceneId,

LayoutId: newLayoutId,

}

_, err := liveClient.UpdateCasterSceneConfig(setCasterSceneConfigRequest)

if err != nil {

return errors.New("UpdateCasterSceneConfig failed: " + err.Error())

}

return nil

}

// 停止导播台

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

}

// 删除导播台

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

}

func main() {

liveClient, err := GetClientInstance()

if err != nil {

panic(err)

}

// 创建导播台

createCasterResponse, err := CreateCaster(liveClient)

if err != nil {

panic(err)

}

casterId := createCasterResponse.Body.CasterId

log.Println("CasterId: ", *casterId)

// 设置导播台

domainName := tea.String("example.aliyundoc.com") // 设置域名

SetCasterConfig(liveClient, casterId, domainName)

// 添加资源,需在函数内添加视频源

AddCasterVideoResource(liveClient, casterId)

// 添加布局

addCasterLayoutResponse, err := AddCasterLayout(liveClient, casterId)

if err != nil {

panic(err)

}

layoutId := addCasterLayoutResponse.Body.LayoutId

// 启动导播台、设置播放场景

startCasterResp, err := StartCaster(liveClient, casterId, layoutId)

if err != nil {

panic(err)

}

// 添加ET字幕组件并应用PGM到场景(可选)

pgmSceneId := startCasterResp.Body.PgmSceneInfos.SceneInfo[0].SceneId

AddETComponent(liveClient, casterId, layoutId, pgmSceneId)

// 切换布局(可选)

// newLayoutId := tea.String("xxxx")

// ChangeLayout(liveClient, casterId, pgmSceneId, newLayoutId)

time.Sleep(time.Minute * 10)

// 停止导播台

StopCaster(liveClient, casterId)

// 删除导播台

DeleteCaster(liveClient, casterId)

}