帮你快速理解、总结文档立即下载

媒体与 HLS

最近更新时间:2026-09-30 16:51:33
我的收藏

前期准备

开始操作前,确保您已经完成了 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 为最终响应的 200
fmt.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 中的预签名信息直传 COS
case 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)
}
}