前期准备
开始操作前,确保您已经完成了 SDK 初始化。如果您还没有初始化 SDK,请先参考快速入门文档完成。
注意事项:
媒体与 HLS 相关接口需要 space_admin 或 admin 权限。
视频转码(CreateTranscodeTask)为异步任务,返回 taskId,需通过任务管理接口轮询执行结果。
m3u8 上传采用「准备 → 上传分片 → 确认 → (可选)续期/追加」的多步流程,请按本文档说明的顺序编排。
查询媒体文件元信息
功能说明
GetMediaFileInfo 用于查询媒体文件的元信息,包括分辨率、码率、时长和可用的转码模板。使用示例
ctx := context.Background()resp, httpRes, err := apiClient.HlsAPI.GetMediaFileInfo(ctx, "your-library-id", "your-space-id", "/videos/movie.mp4").Info(1).AccessToken("your-access-token").Execute()if err != nil {panic(err)}if httpRes.StatusCode == 200 {fmt.Printf("分辨率: %sx%s\\n", *resp.Width, *resp.Height)fmt.Printf("码率: %s kbps, 时长: %s 秒\\n", *resp.Bitrate, *resp.Duration)fmt.Printf("可用转码模板: %v\\n", resp.AllowedTranscodingTemplates)}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
libraryId | 媒体库 ID | string | 是 |
spaceId | 空间 ID,如果媒体库为单租户模式,则该参数固定为连字符(-);如果媒体库为多租户模式,则必须指定该参数 | string | 是 |
filePath | 媒体文件路径 | string | 是 |
info | 固定值 1,表示查询媒体文件元信息 | int32 | 是 |
accessToken | 访问令牌 | string | 否 |
userId | 用户身份识别 | string | 否 |
返回值说明
HTTP 状态码:200,查询成功。
字段 | 说明 | 类型 |
width | 视频宽度,单位 px,字符串格式 | String |
height | 视频高度,单位 px,字符串格式 | String |
bitrate | 码率,单位 kbps,字符串格式 | String |
duration | 时长,单位秒,字符串格式 | String |
allowedTranscodingTemplates | 允许使用的转码模板列表 | Array |
视频转码
功能说明
CreateTranscodeTask 用于发起视频转码任务,将视频转码为指定分辨率的 HLS 格式。转码为异步任务,返回 taskId,需通过任务管理接口轮询执行结果。使用示例
ctx := context.Background()resp, httpRes, err := apiClient.HlsAPI.CreateTranscodeTask(ctx, "your-library-id", "your-space-id", "/videos/movie.mp4").Transcode(1).CreateTranscodeTaskRequest(client.CreateTranscodeTaskRequest{TranscodingTemplateId: "h264_720p",}).AccessToken("your-access-token").Execute()if err != nil {panic(err)}if httpRes.StatusCode == 200 && resp.TaskId != nil {fmt.Printf("转码任务已提交,taskId: %d\\n", *resp.TaskId)// 通过任务管理接口轮询转码结果}
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
libraryId | 媒体库 ID | string | 是 |
spaceId | 空间 ID | string | 是 |
filePath | 源视频文件路径 | string | 是 |
transcode | 固定值 1,表示视频转码 | int32 | 是 |
createTranscodeTaskRequest | 转码请求对象:TranscodingTemplateId(string,必填)为转码模板,取值 h264_360p(流畅)、h264_480p(低清)、h264_720p(高清)、h264_1080p(超清)、h264_2K、h264_4K,不允许大于原视频分辨率 | CreateTranscodeTaskRequest | 是 |
accessToken | 访问令牌 | string | 否 |
返回值说明
HTTP 状态码:200,转码任务已提交。
字段 | 说明 | 类型 |
taskId | 异步转码任务 ID | Int64 |
实时转码(边转边播)
功能说明
LiveTranscodeMediaFile 用于实时转码并获取播放列表,服务端通过 HTTP 302 重定向到真实的 m3u8 播放地址,可实现边转边播。仅支持将非 HLS 源文件转为 HLS 播放,不支持符号链接和历史版本。注意:SDK 默认使用
http.DefaultClient 且未设置 CheckRedirect,会自动跟随服务端返回的 302;由于 200 不在本接口声明的响应码中,跟随成功后 Execute 返回 (nil, 200, nil),播放列表内容不会被解析返回。如需获取 Location 中的播放地址本身,请通过 cfg.HTTPClient 注入自定义 http.Client 并在 CheckRedirect 中返回 http.ErrUseLastResponse 阻止自动跟随,此时 302 会因状态码 ≥ 300 被 SDK 判为错误(GenericOpenAPIError),可从 httpRes.Header.Get("Location") 读取地址。使用示例
ctx := context.Background()// 如需获取 Location 中的播放地址而非自动跟随跳转,注入自定义 http.Client 阻止重定向cfg := client.NewConfiguration()cfg.Servers = client.ServerConfigurations{{URL: "https://smhxxx.api.tencentsmh.cn", Description: "SMH API Server"},}cfg.HTTPClient = &http.Client{CheckRedirect: func(req *http.Request, via []*http.Request) error {return http.ErrUseLastResponse // 阻止自动跟随,保留 302 响应},}apiClient := client.NewAPIClient(cfg)_, httpRes, err := apiClient.HlsAPI.LiveTranscodeMediaFile(ctx, "your-library-id", "your-space-id", "/videos/movie.mp4").LiveTranscode(1).TranscodingTemplateId("h264_720p").AccessToken("your-access-token").Execute()if err != nil {// 阻止跟随后,302 会因状态码 >= 300 被 SDK 判为错误,此时从 Location 取播放地址if httpRes != nil && httpRes.StatusCode == 302 {fmt.Printf("播放地址: %s\\n", httpRes.Header.Get("Location"))} else {panic(err)}}// 若使用默认 apiClient(自动跟随),则 err 为 nil、httpRes.StatusCode 为 200,// 但 200 不在本接口声明的响应码中,Execute 第一个返回值为 nil,// m3u8 内容不会被解析返回,请按上面的方式获取播放地址
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
libraryId | 媒体库 ID | string | 是 |
spaceId | 空间 ID | string | 是 |
filePath | 源视频文件路径 | string | 是 |
liveTranscode | 固定值 1,表示实时转码 | int32 | 是 |
transcodingTemplateId | 转码模板,同视频转码接口 | string | 是 |
accessToken | 访问令牌 | string | 否 |
userId | 用户身份识别 | string | 否 |
下载转码后的视频
功能说明
DownloadTranscodedVideo 用于下载转码后的视频。如果 m3u8 转封装未完成会返回 FileConverting 错误;如果转码任务未完成,会返回原始视频的下载链接。本接口在 FileAPI 中。使用示例
ctx := context.Background()httpRes, err := apiClient.FileAPI.DownloadTranscodedVideo(ctx, "your-library-id", "your-space-id", "/videos/movie.mp4").TranscodingTemplateId("h264_720p").AccessToken("your-access-token").Execute()if err != nil {panic(err)}// 服务端返回 302,SDK 默认自动跟随跳转后 httpRes.StatusCode 为最终响应的 200fmt.Printf("Status: %d\\n", httpRes.StatusCode)
参数说明
参数名 | 参数描述 | 类型 | 是否必填 |
libraryId | 媒体库 ID | string | 是 |
spaceId | 空间 ID | string | 是 |
filePath | 视频文件路径 | string | 是 |
transcodingTemplateId | 转码模板:h264_360p、h264_480p、h264_720p、h264_1080p、h264_2K、h264_4K | string | 是 |
accessToken | 访问令牌 | string | 否 |
m3u8 上传
m3u8 上传用于将已切片好的 HLS 资源(m3u8 播放列表 + ts 分片)上传到 SMH,采用多步流程:
1. 上传准备(PrepareM3u8Upload):提交播放列表与分片清单,获取 confirmKey 与各文件的预签名上传信息;命中秒传时直接完成(200)。
2. 上传分片:客户端按返回的预签名信息,将 playlist 和各 segment 直传 COS。
3. 上传完成(ConfirmM3u8Upload):分片上传完成后提交 CRC64 校验值确认,分批确认时最后确认 playlist。
4. 上传续期(RenewM3u8Upload,可选):预签名信息过期(expiration)前续期。
5. 分片重传与追加(ModifyM3u8Segments):分片失败重传或追加分片(分片数超过单次上限 100 个时分批追加,带密钥时上限 101 个)。
上传准备
功能说明
PrepareM3u8Upload(PUT + body),返回 201 表示需继续上传(含 confirmKey 和预签名信息),返回 200 表示秒传命中直接完成。注意 Execute() 的返回值顺序为 (resp201, resp200, httpRes, err)。使用示例
ctx := context.Background()prepareReq := client.PrepareM3u8UploadRequest{Segments: []client.PrepareM3u8UploadRequestSegmentsInner{{Path: client.PtrString("1.ts")},{Path: client.PtrString("2.ts")},},}resp201, resp200, httpRes, err := apiClient.HlsAPI.PrepareM3u8Upload(ctx, "your-library-id", "your-space-id", "/videos/hls/movie.m3u8").ConflictResolutionStrategy("rename").PrepareM3u8UploadRequest(prepareReq).AccessToken("your-access-token").Execute()if err != nil {panic(err)}switch httpRes.StatusCode {case 201:fmt.Printf("ConfirmKey: %s\\n", *resp201.ConfirmKey)// 按 resp201.Playlist 与 resp201.Segments 中的预签名信息直传 COScase 200:fmt.Println("秒传成功")}
PrepareM3u8UploadRequest 对象说明
字段 | 参数描述 | 类型 | 是否必填 |
Playlist | m3u8 播放列表内容(media playlist,固定简单上传) | map[string]interface | 否 |
Segments | 分片清单,最多 100 个(带密钥 101 个),超出部分通过分片重传与追加接口分批上传;元素含 Path(分片相对路径,如 1.ts 或 abc/def/1.ts)与 UploadMethod(simple 默认 / multipart) | []PrepareM3u8UploadRequestSegmentsInner | 否 |
SampleHash | 秒传抽样哈希,与 SegmentsCount 捆绑使用 | *string | 否 |
SegmentsCount | 分片总数,字符串格式,与 SampleHash 捆绑使用 | *string | 否 |
201 响应说明:confirmKey(上传确认标识,后续 confirm/renew/modify 的路径参数);playlist 与 segments(map,key 为分片路径)中均含 domain、path、headers、expiration(过期时间,失效前需通过续期接口续期);segments 的 uploadId 仅分块上传时返回。
上传完成
功能说明
ConfirmM3u8Upload(POST + confirm=1 + confirmKey 路径参数),提交各分片与播放列表的 CRC64 校验值完成上传。分片较多时可分批确认(每批最多 100 个 ts,有密钥 101 个),最后一批或单独最后确认 playlist。使用示例
ctx := context.Background()confirmReq := client.ConfirmM3u8UploadRequest{Segments: []client.ConfirmM3u8UploadRequestSegmentsInner{{Path: client.PtrString("1.ts"), Crc64: client.PtrString("crc64-of-segment-1")},{Path: client.PtrString("2.ts"), Crc64: client.PtrString("crc64-of-segment-2")},},// Playlist 的 crc64 与最后一批 Segments 同传,或单独最后提交}resp, httpRes, err := apiClient.HlsAPI.ConfirmM3u8Upload(ctx, "your-library-id", "your-space-id", "confirm-key-from-prepare").Confirm(1).ConfirmM3u8UploadRequest(confirmReq).AccessToken("your-access-token").Execute()if err != nil {panic(err)}if httpRes.StatusCode == 200 && resp.Playlist != nil {fmt.Printf("播放列表路径: %v\\n", resp.Playlist.Path)}
上传续期与分片重传追加
功能说明
RenewM3u8Upload(POST + renew=1 + confirmKey):续期 playlist 和/或指定分片的预签名上传信息,body 中 Playlist(固定 "m3u8")与 Segments(路径数组,最多 100/101 个)按需传入。ModifyM3u8Segments(POST + modify=1 + confirmKey):重传失败分片或追加分片,body 的 Segments 结构同上传准备接口(必填)。使用示例
ctx := context.Background()renewReq := client.RenewM3u8UploadRequest{Segments: []string{"1.ts", "2.ts"},}resp, httpRes, err := apiClient.HlsAPI.RenewM3u8Upload(ctx, "your-library-id", "your-space-id", "confirm-key-from-prepare").Renew(1).RenewM3u8UploadRequest(renewReq).AccessToken("your-access-token").Execute()if err != nil {panic(err)}if httpRes.StatusCode == 200 {// 使用新的预签名信息(含新的 expiration)继续上传for path := range *resp.Segments {fmt.Printf("已续期分片: %s\\n", path)}}