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

媒体与HLS

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

前期准备

开始操作前,确保您已经完成了 SDK 初始化。如果您还没有初始化 SDK,请先参考快速入门文档完成。
注意事项:
媒体与 HLS 相关接口需要 space_admin 或 admin 权限。
视频转码(createTranscodeTask)为异步任务,返回 taskId,需通过任务管理接口轮询执行结果。
m3u8 上传采用「准备 → 上传分片 → 确认 → (可选)续期/追加」的多步流程,请按本文档说明的顺序编排。

查询媒体文件元信息

功能说明
getMediaFileInfo 用于查询媒体文件的元信息,包括分辨率、码率、时长和可用的转码模板。
使用示例
const res = await smh.hls.getMediaFileInfo({
spaceId: 'your-space-id',
filePath: '/videos/movie.mp4',
info: 1,
});

if (res.status === 200) {
console.log('分辨率:', res.data.width + 'x' + res.data.height);
console.log('码率:', res.data.bitrate, 'kbps');
console.log('时长:', res.data.duration, '秒');
console.log('可用转码模板:', res.data.allowedTranscodingTemplates);
}
参数说明
参数名
参数描述
类型
是否必填
spaceId
空间 ID,如果媒体库为单租户模式,则该参数固定为连字符(-);如果媒体库为多租户模式,则必须指定该参数
String
是
filePath
媒体文件路径
String
是
info
固定值 1,表示查询媒体文件元信息
Number
是
返回值说明
HTTP 状态码:200,查询成功。
字段
说明
类型
width
视频宽度,单位 px,字符串格式
String
height
视频高度,单位 px,字符串格式
String
bitrate
码率,单位 kbps,字符串格式
String
duration
时长,单位秒,字符串格式
String
allowedTranscodingTemplates
允许使用的转码模板列表
Array<String>

视频转码

功能说明
createTranscodeTask 用于发起视频转码任务,将视频转码为指定分辨率的 HLS 格式。转码为异步任务,返回 taskId,需通过任务管理接口轮询执行结果。
使用示例
const res = await smh.hls.createTranscodeTask({
spaceId: 'your-space-id',
filePath: '/videos/movie.mp4',
transcode: 1,
createTranscodeTaskRequest: {
transcodingTemplateId: 'h264_720p',
},
});

if (res.status === 200) {
console.log('转码任务已提交,taskId:', res.data.taskId);
// 通过任务管理接口轮询转码结果
}
参数说明
参数名
参数描述
类型
是否必填
spaceId
空间 ID
String
是
filePath
源视频文件路径
String
是
transcode
固定值 1,表示视频转码
Number
是
createTranscodeTaskRequest
转码请求对象
Object
是
createTranscodeTaskRequest 对象说明
字段
参数描述
类型
是否必填
transcodingTemplateId
转码模板:h264_360p(流畅)、h264_480p(低清)、h264_720p(高清)、h264_1080p(超清)、h264_2K、h264_4K;不允许大于原视频分辨率
String
是
返回值说明
HTTP 状态码:200,转码任务已提交。
字段
说明
类型
taskId
异步转码任务 ID
Number

实时转码(边转边播)

功能说明
liveTranscodeMediaFile 用于实时转码并获取播放列表,服务端通过 HTTP 302 重定向到真实的 m3u8 播放地址(axios 会自动跟随跳转,客户端实际观察到的 res.status 为最终响应的 200),可实现边转边播。仅支持将非 HLS 源文件转为 HLS 播放,不支持符号链接和历史版本。
使用示例
const res = await smh.hls.liveTranscodeMediaFile({
spaceId: 'your-space-id',
filePath: '/videos/movie.mp4',
liveTranscode: 1,
transcodingTemplateId: 'h264_720p',
});

// 服务端返回 302,axios 自动跟随跳转后 res.status 为最终响应的 200
console.log('Status:', res.status);
参数说明
参数名
参数描述
类型
是否必填
spaceId
空间 ID
String
是
filePath
源视频文件路径
String
是
liveTranscode
固定值 1,表示实时转码
Number
是
transcodingTemplateId
转码模板,同视频转码接口
String
是

下载转码后的视频

功能说明
downloadTranscodedVideo 用于下载转码后的视频。如果 m3u8 转封装未完成会返回 FileConverting 错误;如果转码任务未完成,会返回原始视频的下载链接。本接口在 file 模块中。
使用示例
const res = await smh.file.downloadTranscodedVideo({
spaceId: 'your-space-id',
filePath: '/videos/movie.mp4',
transcodingTemplateId: 'h264_720p',
});

// 服务端返回 302,axios 自动跟随跳转后 res.status 为最终响应的 200
console.log('Status:', res.status);
参数说明
参数名
参数描述
类型
是否必填
spaceId
空间 ID
String
是
filePath
视频文件路径
String
是
transcodingTemplateId
转码模板:h264_360p、h264_480p、h264_720p、h264_1080p、h264_2K、h264_4K
String
是

m3u8 上传

m3u8 上传用于将已切片好的 HLS 资源(m3u8 播放列表 + ts 分片)上传到 SMH,采用多步流程:
1. 上传准备(prepareM3u8Upload):提交播放列表与分片清单,获取 confirmKey 与各文件的预签名上传信息;命中秒传时直接完成。
2. 上传分片:客户端按返回的预签名信息,将 playlist 和各 segment 直传 COS。
3. 上传完成(confirmM3u8Upload):分片上传完成后提交 CRC64 校验值确认,分批确认时最后确认 playlist。
4. 上传续期(renewM3u8Upload,可选):预签名信息过期(expiration)前续期。
5. 分片重传与追加(modifyM3u8Segments):分片失败重传或追加分片(分片数超过单次上限 100 个时分批追加,带密钥时上限 101 个)。

上传准备

功能说明
prepareM3u8Upload(PUT + body),返回 201 表示需继续上传(含 confirmKey 和预签名信息),返回 200 表示秒传命中直接完成。
使用示例
const res = await smh.hls.prepareM3u8Upload({
spaceId: 'your-space-id',
filePath: '/videos/hls/movie.m3u8',
conflictResolutionStrategy: 'rename',
prepareM3u8UploadRequest: {
segments: [
{ path: '1.ts' },
{ path: '2.ts' },
],
},
});

if (res.status === 201) {
console.log('ConfirmKey:', res.data.confirmKey);
// 按 res.data.playlist 与 res.data.segments 中的预签名信息直传 COS
} else if (res.status === 200) {
console.log('秒传成功');
}
prepareM3u8UploadRequest 对象说明
字段
参数描述
类型
是否必填
playlist
m3u8 播放列表内容(media playlist,固定简单上传)
Object
否
segments
分片清单,最多 100 个(带密钥 101 个),超出部分通过分片重传与追加接口分批上传
Array
否
sampleHash
秒传抽样哈希,与 segmentsCount 捆绑使用
String
否
segmentsCount
分片总数,字符串格式,与 sampleHash 捆绑使用
String
否
segments 元素说明:path(分片相对路径,如 1.ts 或 abc/def/1.ts)、uploadMethod(上传方式:simple 默认 / multipart)。
201 响应说明:confirmKey(上传确认标识);playlist 与 segments(Map,key 为分片路径)中均含 domain、path、headers、expiration(过期时间,失效前需通过续期接口续期);segments 的 uploadId 仅分块上传时返回。

上传完成

功能说明
confirmM3u8Upload(POST + confirm=1 + confirmKey),提交各分片与播放列表的 CRC64 校验值完成上传。分片较多时可分批确认(每批最多 100 个 ts,有密钥 101 个),最后一批或单独最后确认 playlist。
使用示例
const res = await smh.hls.confirmM3u8Upload({
spaceId: 'your-space-id',
confirmKey: 'confirm-key-from-prepare',
confirm: 1,
confirmM3u8UploadRequest: {
segments: [
{ path: '1.ts', crc64: 'crc64-of-segment-1' },
{ path: '2.ts', crc64: 'crc64-of-segment-2' },
],
// playlist 的 crc64 与最后一批 segments 同传,或单独最后提交
},
});

if (res.status === 200) {
console.log('播放列表路径:', res.data.playlist?.path);
}

上传续期与分片重传追加

功能说明
renewM3u8Upload(POST + renew=1 + confirmKey):续期 playlist 和/或指定分片的预签名上传信息,body 中 playlist(固定 'm3u8')与 segments(路径数组,最多 100/101 个)按需传入。
modifyM3u8Segments(POST + modify=1 + confirmKey):重传失败分片或追加分片,body 的 segments 结构同上传准备接口。
使用示例
const res = await smh.hls.renewM3u8Upload({
spaceId: 'your-space-id',
confirmKey: 'confirm-key-from-prepare',
renew: 1,
renewM3u8UploadRequest: {
segments: ['1.ts', '2.ts'],
},
});

if (res.status === 200) {
// 使用新的预签名信息(含新的 expiration)继续上传
console.log('续期完成:', Object.keys(res.data.segments || {}));
}