阅读本文,您可以获取 Go SDK 拉流转推的接口调用示例,实现快速开发。
说明
本文的调用示例包含接口的部分参数。由于参数间可能存在互斥关系,在调用时,请您参考注释,进行调整。
调用接口前,请先完成 Go SDK 的安装及初始化操作。
本节为您介绍拉流转推相关接口的功能和调用示例。
您可以调用 CreatePullToPushTask 接口创建拉流转推任务。详细的参数说明可参见 CreatePullToPushTask 接口文档。
接口调用示例如下所示。
package main import ( "os" "context" "fmt" "github.com/volcengine/volc-sdk-golang/base" live "github.com/volcengine/volc-sdk-golang/service/live/v20230101" ) func StringPtr(v string) *string { return &v } func Int32Ptr(v int32) *int32 { return &v } func StringPtrs(vals []string) []*string { ptrs := make([]*string, len(vals)) for i := 0; i < len(vals); i++ { ptrs[i] = &vals[i] } return ptrs } func Float32Ptrs(vals []float32) []*float32 { ptrs := make([]*float32, len(vals)) for i := 0; i < len(vals); i++ { ptrs[i] = &vals[i] } return ptrs } func Float32Ptr(v float32) *float32 { return &v } func main () { // 强烈建议不要把 AccessKey ID 和 AccessKey Secret 保存到工程代码里,否则可能导致 AccessKey 泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取 AccessKey ID 和 AccessKey Secret,来实现 API 访问的身份验证。运行代码示例前,请配置环境变量 ACCESS_KEY_ID 和 ACCESS KEY_SECRET service := live.NewInstance() service.SetCredential(base.Credentials{ AccessKeyID: os.Getenv("ACCESS_KEY_ID"), SecretAccessKey: os.Getenv("ACCESS_KEY_SECRET"), }) body := &live.CreatePullToPushTaskBody{ // 拉流转推任务的名称,默认为空表示不配置任务名称。支持由中文、大小写字母(A - Z、a - z)和数字(0 - 9)组成,长度为 1 到 20 各字符。 Title: StringPtr(`task001`), // 任务的开始时间,Unix 时间戳,单位为秒。 // note: // 拉流转推任务持续时间最长为 7 天。 StartTime: 1640891476, // 任务的结束时间,Unix 时间戳,单位为秒。 // note: // 拉流转推任务持续时间最长为 7 天。 EndTime: 1640841476, // 接收拉流转推任务状态回调的地址,最大长度为 2000 个字符,默认为空。 CallbackURL: StringPtr(`http://example.mtime.cn/live/example/callbackapi`), // 拉流来源类型,支持的取值及含义如下。 // <li> `0`:直播源; </li> // <li> `1`:点播视频。 </li> Type: 0, // 点播视频文件循环播放模式,当拉流来源类型为点播视频时为必选参数,参数取值及含义如下所示。 // <li> `-1`:无限次循环,至任务结束; </li> // <li> `0`:有限次循环,循环次数以 PlayTimes 取值为准; </li> // <li> `>0`:有限次循环,循环次数由 CycleMode 和 PlayTimes 共同决定: </li> // <li> PlayTimes 为 0 时,循环次数以 CycleMode 为准; </li> // <li> PlayTimes 为正整数时,循环次数以 PlayTimes为准。 </li> CycleMode: Int32Ptr(-1), // 推流地址,即直播源或点播视频转推的目标地址。 DstAddr: StringPtr(`rtmp://example.mtime.cn/Video/2022/02/04/mp4/190204084208765161.mp4`), // 直播源的拉流地址,拉流来源类型为直播源时,为必传参数,最大长度为 1000 个字符。 SrcAddr: StringPtr(`http://example.mtime.cn/Video/2003/02/04/mp4/190204084208765161.mp4`), // 点播视频文件循环播放次数,当循环播放模式为有限次循环时为必选参数,取值范围为 0 或正整数。 PlayTimes: Int32Ptr(3), // 推流域名,推流地址(DstAddr)为空时必传;反之,则该参数不生效。 Domain: StringPtr(`example.mtime.cn`), // 推流应用名称,推流地址(DstAddr)为空时必传;反之,则该参数不生效。 App: StringPtr(`live`), // 推流的流名称,推流地址(DstAddr)为空时必传;反之,则该参数不生效。 Stream: StringPtr(`stream-123`), // 是否开启点播预热,开启点播预热后,系统会自动将点播视频文件缓存到 CDN 节点上,当用户请求直播时,可以直播从 CDN 节点获取视频,从而提高直播流畅度。拉流来源类型为点播视频时,参数生效。 // <li> `0`:不开启; </li> // <li> `1`:开启(默认值)。 </li> PreDownload: Int32Ptr(1), // 续播策略,续播策略指转推点播视频进行直播时出现断流并恢复后,如何继续播放的策略,拉流来源类型为点播视频(Type 为 1)时参数生效,支持的取值及含义如下。 // <li> `0`:从断流处续播(默认值); </li> // <li> `1`:从断流处+自然流逝时长处续播。 </li> ContinueStrategy: Int32Ptr(9), // 点播文件启播时间偏移值,单位为秒,仅当点播视频播放地址列表(SrcAddrS)只有一个地址,且未配置 Offsets 时生效,缺省情况下为空表示不进行偏移。 Offset: Float32Ptr(30), } // 点播视频播放地址列表,拉流来源类型为点播视频时,为必传参数,最多支持传入 30 个点播视频播放地址,每个地址最大长度为 1000 个字符。 SrcAddrS := []string{"https://pull.example.com/live/stream-123"} body.SrcAddrS = StringPtrs(SrcAddrS) // 为拉流转推视频添加的水印配置信息。 Watermark := live.CreatePullToPushTaskBodyWatermark{ // 水印图片字符串,图片最大 2MB,最小 100Bytes,最大分辨率为 1080×1080。图片 Data URL 格式为:`data:image/<mediatype>;base64,<data>`。 // <li> `mediatype`:图片类型,支持 png、jpg、jpeg 格式; </li> // <li> `data`:base64 编码的图片字符串。 </li> // 例如,`data:image/png;base64,iVBORw0KGg****mCC` Picture: `data:image/png;base64,iVBORw0KGg\*\*\*\*mCC`, // 水平偏移,表示水印左侧边与转码流画面左侧边之间的距离,使用相对比率,取值范围为 [0,1)。 RelativePosX: 0.1, // 垂直偏移,表示水印顶部边与转码流画面顶部边之间的距离,使用相对比率,取值范围为 [0,1)。 RelativePosY: 0.1, // 水印宽度占直播原始画面宽度百分比,支持精度为小数点后两位。 Ratio: 0.1, } body.Watermark = &Watermark // 点播文件启播时间偏移值,单位为秒,数量与拉流地址列表中地址数量相等,缺省情况下为空表示不进行偏移。拉流来源类型为点播视频时,参数生效。 OffsetS := []float32{30} body.OffsetS = Float32Ptrs(OffsetS) resp, err := service.CreatePullToPushTask(context.Background(), body) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %+v", resp) } }
您可以调用 DeletePullToPushTask 接口删除拉流转推任务。详细的参数说明可参见 DeletePullToPushTask 接口文档。
接口调用示例如下所示。
package main import ( "os" "context" "fmt" "github.com/volcengine/volc-sdk-golang/base" live "github.com/volcengine/volc-sdk-golang/service/live/v20230101" ) func main () { // 强烈建议不要把 AccessKey ID 和 AccessKey Secret 保存到工程代码里,否则可能导致 AccessKey 泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取 AccessKey ID 和 AccessKey Secret,来实现 API 访问的身份验证。运行代码示例前,请配置环境变量 ACCESS_KEY_ID 和 ACCESS KEY_SECRET service := live.NewInstance() service.SetCredential(base.Credentials{ AccessKeyID: os.Getenv("ACCESS_KEY_ID"), SecretAccessKey: os.Getenv("ACCESS_KEY_SECRET"), }) body := &live.DeletePullToPushTaskBody{ // 任务 ID,任务的唯一标识,您可以通过[获取拉流转推任务列表](https://www.volcengine.com/docs/6469/1126896)接口获取。 TaskId: `8fde6aa0281d9f*******05a6e242365`, } resp, err := service.DeletePullToPushTask(context.Background(), body) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %+v", resp) } }
您可以调用 UpdatePullToPushTask 接口更新拉流转推任务。详细的参数说明可参见 UpdatePullToPushTask 接口文档。
接口调用示例如下所示。
package main import ( "os" "context" "fmt" "github.com/volcengine/volc-sdk-golang/base" live "github.com/volcengine/volc-sdk-golang/service/live/v20230101" ) func StringPtr(v string) *string { return &v } func Int32Ptr(v int32) *int32 { return &v } func StringPtrs(vals []string) []*string { ptrs := make([]*string, len(vals)) for i := 0; i < len(vals); i++ { ptrs[i] = &vals[i] } return ptrs } func Float32Ptrs(vals []float32) []*float32 { ptrs := make([]*float32, len(vals)) for i := 0; i < len(vals); i++ { ptrs[i] = &vals[i] } return ptrs } func Float32Ptr(v float32) *float32 { return &v } func main () { // 强烈建议不要把 AccessKey ID 和 AccessKey Secret 保存到工程代码里,否则可能导致 AccessKey 泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取 AccessKey ID 和 AccessKey Secret,来实现 API 访问的身份验证。运行代码示例前,请配置环境变量 ACCESS_KEY_ID 和 ACCESS KEY_SECRET service := live.NewInstance() service.SetCredential(base.Credentials{ AccessKeyID: os.Getenv("ACCESS_KEY_ID"), SecretAccessKey: os.Getenv("ACCESS_KEY_SECRET"), }) body := &live.UpdatePullToPushTaskBody{ // 拉流转推任务的名称,默认为空表示不配置任务名称。支持由中文、大小写字母(A - Z、a - z)和数字(0 - 9)组成,长度为 1 到 20 各字符。 Title: StringPtr(`task001`), // 任务 ID,任务的唯一标识,您可以通过[获取拉流转推任务列表](https://www.volcengine.com/docs/6469/1126896)接口获取。 TaskId: `8fde6aa0281*********59a6e242365`, // 任务的开始时间,Unix 时间戳,单位为秒。 // note: // 拉流转推任务持续时间最长为 7 天。 StartTime: 1640891476, // 任务等结束时间,Unix 时间戳,单位为秒。 // note: // 拉流转推任务持续时间最长为 7 天。 EndTime: 1640891976, // 接收拉流转推任务状态回调的地址,最大长度为 2000 个字符。 CallbackURL: StringPtr(`http://example.mtime.cn/live/example/callbackapi`), // 拉流来源类型,支持的取值及含义如下。 // <li> `0`:直播源; </li> // <li> `1`:点播视频。 </li> Type: 0, // 点播视频文件循环播放模式,当拉流来源类型为点播视频时为必选参数,参数取值及含义如下所示。 // <li> `-1`:无限次循环,至任务结束; </li> // <li> `0`:有限次循环,循环次数以 PlayTimes 取值为准; </li> // <li> `>0`:有限次循环,循环次数由 CycleMode 和 PlayTimes 共同决定: </li> // <li> PlayTimes 为 0 时,循环次数以 CycleMode 为准; </li> // <li> PlayTimes 为正整数时,循环次数以 PlayTimes为准。 </li> CycleMode: Int32Ptr(-1), // 推流地址,即直播源或点播视频转推的目标地址。 DstAddr: StringPtr(`rtmp://example.mtime.cn/Video/2022/02/04/mp4/190204084208765161.mp4`), // 直播源的拉流地址,拉流来源类型为直播源(Type 为 0)时,为必选参数,最大长度为 1000 个字符。 SrcAddr: StringPtr(`http://example.mtime.cn/Video/2003/02/04/mp4/190204084208765161.mp4`), // 推流的流名称,推流地址(DstAddr)为空时必传;反之,则该参数不生效 Stream: StringPtr(`stream-123`), // 推流应用名称,推流地址(DstAddr)为空时必传;反之,则该参数不生效 App: StringPtr(`live`), // 推流域名,推流地址(DstAddr)为空时必传;反之,则该参数不生效 Domain: StringPtr(`push.example.com`), // 是否开启点播预热,开启点播预热后,系统会自动将点播视频文件缓存到 CDN 节点上,当用户请求直播时,可以直播从 CDN 节点获取视频,从而提高直播流畅度。 // 拉流来源类型为点播视频(Type 为 1)时,参数生效。 // <li> `0`:不开启; </li> // <li> `1`:开启(默认值)。 </li> PreDownload: Int32Ptr(1), // 续播策略,续播策略指转推点播视频进行直播时出现断流并恢复后,如何继续播放的策略,拉流来源类型为点播视频(Type 为 1)时参数生效,支持的取值及含义如下。 // <li> `0`:从断流处续播(默认值); </li> // <li> `1`:从断流处+自然流逝时长处续播。 </li> ContinueStrategy: Int32Ptr(9), // 点播文件启播时间偏移值,单位为秒,仅当点播视频播放地址列表(SrcAddrS)只有一个地址,且未配置 Offsets 时生效,缺省情况下表示不进行偏移。 Offset: Float32Ptr(30), // 点播视频文件循环播放次数,当循环播放模式为有限次循环时为必选参数,取值范围为 0 或正整数。 PlayTimes: Int32Ptr(3), } // 点播视频播放地址列表,拉流来源类型为点播视频(Type 为 1)时,为必选参数,最多支持传入 30 个点播视频播放地址,每个地址最大长度为 1000 个字符。 SrcAddrS := []string{"http://example.mtime.cn/Video/2003/02/04/mp4/190204084208765161.mp4"} body.SrcAddrS = StringPtrs(SrcAddrS) // 为拉流转推视频添加的水印配置信息。 Watermark := live.UpdatePullToPushTaskBodyWatermark{ // 水印图片字符串,图片最大 2MB,最小 100Bytes,最大分辨率为 1080×1080。图片 Data URL 格式为:`data:image/<mediatype>;base64,<data>`。 // <li> `mediatype`:图片类型,支持 png、jpg、jpeg 格式; </li> // <li> `data`:base64 编码的图片字符串。 </li> // 例如,`data:image/png;base64,iVBORw0KGg****mCC` Picture: `data:image/png;base64,iVBORw0KGg\*\*\*\*mCC`, // 水平偏移,表示水印左侧边与转码流画面左侧边之间的距离,使用相对比率,取值范围为 [0,1)。 RelativePosX: 0.1, // 垂直偏移,表示水印顶部边与转码流画面顶部边之间的距离,使用相对比率,取值范围为 [0,1)。 RelativePosY: 0.1, // 水印宽度占直播原始画面宽度百分比,支持精度为小数点后两位。 Ratio: 0.1, } body.Watermark = &Watermark // 点播文件启播时间偏移值,单位为秒,数量与拉流地址列表中地址数量相等,缺省情况下表示不进行偏移。 // 拉流来源类型为点播视频(Type 为 1)时,参数生效。 OffsetS := []float32{30} body.OffsetS = Float32Ptrs(OffsetS) resp, err := service.UpdatePullToPushTask(context.Background(), body) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %+v", resp) } }
您可以调用 RestartPullToPushTask 接口启用拉流转推任务。详细的参数说明可参见 RestartPullToPushTask 接口文档。
接口调用示例如下所示。
package main import ( "os" "context" "fmt" "github.com/volcengine/volc-sdk-golang/base" live "github.com/volcengine/volc-sdk-golang/service/live/v20230101" ) func main () { // 强烈建议不要把 AccessKey ID 和 AccessKey Secret 保存到工程代码里,否则可能导致 AccessKey 泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取 AccessKey ID 和 AccessKey Secret,来实现 API 访问的身份验证。运行代码示例前,请配置环境变量 ACCESS_KEY_ID 和 ACCESS KEY_SECRET service := live.NewInstance() service.SetCredential(base.Credentials{ AccessKeyID: os.Getenv("ACCESS_KEY_ID"), SecretAccessKey: os.Getenv("ACCESS_KEY_SECRET"), }) body := &live.RestartPullToPushTaskBody{ // 任务 ID,任务的唯一标识,您可以通过[获取拉流转推任务列表](https://www.volcengine.com/docs/6469/1126896)接口获取状态为停用的任务 ID。 TaskId: `8fde6aa0281d********986e242365`, } resp, err := service.RestartPullToPushTask(context.Background(), body) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %+v", resp) } }
您可以调用 StopPullToPushTask 接口停用拉流转推任务。详细的参数说明可参见 StopPullToPushTask 接口文档。
接口调用示例如下所示。
package main import ( "os" "context" "fmt" "github.com/volcengine/volc-sdk-golang/base" live "github.com/volcengine/volc-sdk-golang/service/live/v20230101" ) func main () { // 强烈建议不要把 AccessKey ID 和 AccessKey Secret 保存到工程代码里,否则可能导致 AccessKey 泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取 AccessKey ID 和 AccessKey Secret,来实现 API 访问的身份验证。运行代码示例前,请配置环境变量 ACCESS_KEY_ID 和 ACCESS KEY_SECRET service := live.NewInstance() service.SetCredential(base.Credentials{ AccessKeyID: os.Getenv("ACCESS_KEY_ID"), SecretAccessKey: os.Getenv("ACCESS_KEY_SECRET"), }) body := &live.StopPullToPushTaskBody{ // 任务 ID,任务的唯一标识,您可以通过[获取拉流转推任务列表](https://www.volcengine.com/docs/6469/1126896)接口获取状态为未开始或生效中的任务 ID。 TaskId: `8fde6aa0281d9f6e1*******a6e242365`, } resp, err := service.StopPullToPushTask(context.Background(), body) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %+v", resp) } }
您可以调用 ListPullToPushTask 接口获取拉流转推任务列表。详细的参数说明可参见 ListPullToPushTask 接口文档。
接口调用示例如下所示。
package main import ( "os" "context" "fmt" "github.com/volcengine/volc-sdk-golang/base" live "github.com/volcengine/volc-sdk-golang/service/live/v20230101" ) func Int32Ptr(v int32) *int32 { return &v } func StringPtr(v string) *string { return &v } func main () { // 强烈建议不要把 AccessKey ID 和 AccessKey Secret 保存到工程代码里,否则可能导致 AccessKey 泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取 AccessKey ID 和 AccessKey Secret,来实现 API 访问的身份验证。运行代码示例前,请配置环境变量 ACCESS_KEY_ID 和 ACCESS KEY_SECRET service := live.NewInstance() service.SetCredential(base.Credentials{ AccessKeyID: os.Getenv("ACCESS_KEY_ID"), SecretAccessKey: os.Getenv("ACCESS_KEY_SECRET"), }) query := &live.ListPullToPushTaskQuery{ // 查询数据的页码,默认为 1,表示查询第一页的数据。 Page: Int32Ptr(1), // 每页显示的数据条数,默认为 20,最大值为 500。 Size: Int32Ptr(20), // 拉流转推任务的名称,不区分大小写,支持模糊查询。 // 例如,`title` 取值为 `doc` 时,则返回任务名称为 `docspace`、`docs`、`DOC` 等 title 中包含 `doc` 关键词的所有任务列表。 Title: StringPtr(`doc`), } resp, err := service.ListPullToPushTask(context.Background(),query) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %+v", resp) } }