使用七牛 sdk 上传视频并做分片操作。
step1 生成 token
const qiniu = require("qiniu"); var accessKey = proc.env.QINIU_ACCESS_KEY; var secretKey = proc.env.QINIU_SECRET_KEY; var mac = new qiniu.auth.digest.Mac(accessKey, secretKey); var bucket = proc.env.QINIU_TEST_BUCKET; // 对象存储空间 //带数据处理的凭证 var origin_filename = "avthumb_test_target.mp4"; // 源文件名 var save_as_filename = `${origin_filename}.m3n8`; // 分片后的文件名 var saveMp4Entry = qiniu.util.urlsafeBase64Encode(`${bucket}:${save_as_filename}`); var avthumbMp4Fop = "avthumb/m3u8/noDomain/1/segtime/15/vb/440k|saveas/" + saveMp4Entry; var options = { scope: bucket, expires: 3600, // 凭证有效时间 persistentOps: avthumbMp4Fop, // 视频上传后触发预转持久化,切片处理 persistentPipeline: "video-pipe", // 多媒体处理队列 persistentNotifyUrl: "http://api.example.com/qiniu/pfop/notify", // 回调通知地址 } var putPolicy = new qiniu.rs.PutPolicy(options); console.log(putPolicy.uploadToken(mac));
生成不同作用的凭证可以查看官方提供的示例nodejs-sdk example。
以上代码为生成上传视频并进行切片处理的凭证。上传相关的文档查看七牛上传策略。
切片动作是由persistentOps参数触发并启动一个异步任务,
persistentOps 详解
persistentOps 字段用于指定预转数据处理命令和保存处理结果的存储空间与资源名。
为此字段指定非空值,则在成功上传一个文件后,会启动一个异步数据处理任务。persistentId 字段,唯一标识此任务。
当 returnBody 中指定了 persistentId 魔法变量时,客户端收到的响应内容 returnBody 中会有 persistentId;当没有指定 returnBody 时,默认也会返回 persistentId。
使用默认的存储空间和资源名
* 当只指定了数据处理命令时,服务端会选择上传文件的 Bucket 作为数据处理结果的存储空间,Key 由七牛服务器自动生成。
使用指定的存储空间和资源名
在数据处理命令后用管道符|拼接saveas/指令,指示七牛服务器使用EncodedEntryURI格式中指定的 Bucket 与 Key 来保存处理结果。如 avthumb/flv|saveas/cWJ1Y2tldDpxa2V5,是将上传的视频文件转码flv格式后存储为qbucket:qkey,其中cWJ1Y2tldDpxa2V5是qbucket:qkey的URL安全的Base64编码结果。以上方式可以同时作用于多个数据处理命令,用;分隔,如 avthumb/mp4|saveas/cWJ1Y2tldDpxa2V5;avthumb/flv|saveas/cWJ1Y2tldDpxa2V5Mg==
数据处理命令可以查看官方文档,比如视频切片接口。
step2 前端直传
POST http://up.qiniu.com 格式: form-data 参数: key: 文件名,上文代码中的 `origin_filename` token: 上传token file: 具体文件 // 上传成功的响应体 // 状态码 200 { "hash": "luVJbz9RtE3Ha7c9XaDerE6rPyvP", "key": "prTEDwvJY18YBD_720_p1.mp4", "persistentId": "z0.5b56c9b938b9f324a573edb4" // 可以使用persistentId,检测当前处理状态 } 作者:youthcity 链接:https://www.jianshu.com/p/f73b39ae02dc 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
step3 轮询获取结果
GET api.qiniu.com/status/get/prefop?id=${persistentId} { "code": 0, // 状态码0成功,1等待处理,2正在处理,3处理失败,4通知提交失败。 "desc": "The fop was completed successfully", "id": "z0.5b56c9b938b9f324a573edb4", "inputBucket": "ocean", "inputKey": "prTEDwvJY18YBD_720_p1.mp4", "items": [ { "cmd": "avthumb/m3u8/noDomain/1/segtime/15/vb/440k|saveas/b2NlYW46aGxzX3ByVEVEd3ZKWTE4WUJEXzcyMF9wMS5tM3U4", "code": 0, "desc": "The fop was completed successfully", "hash": "FraV6PX6Xp7mYYgAnY0sniTK-pPt", "key": "hls_prTEDwvJY18YBD_720_p1.m3u8", "returnOld": 0 } ], "pipeline": "1381326751.k12_video", "reqid": "FQIAAKAxpZfFOkQV" } 作者:youthcity 链接:https://www.jianshu.com/p/f73b39ae02dc 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
参考资料