在项目中使用七牛云的js sdk来上传视频文件,这样可以减少服务器压力,但七牛云的转码需要access token,出于安全考虑,在服务端转码比较好。以下搜集试验几种七牛云的转码。
- 预处理,也就是在生成token的时候policy带预处理接口。空间中只保存一份文档。官方文档参考https://developer.qiniu.com/dora/manual/1248/audio-and-video-transcoding-avthumb #预转持久化 小节
/** * 生成带有上传policy的token * @param key * @return */ public String generateUpTokenWithPolicy(String key) { Auth auth = Auth.create(accessKey, secretKey); String saveAs = UrlSafeBase64.encodeToString(bucket + ":" + key); //saveas接口 参数 String fops = "avthumb/mp4/ab/128k/ar/22050/acodec/libfaac/r/30/vb/300k/vcodec/libx264/s/320x240/autoscale/1/stripmeta/0|saveas/" + saveAs; //处理命令 avthumb 和 saveas 通过管道符 | 进行连接 StringMap putPolicy = new StringMap(); putPolicy.put("persistentOps", fops); putPolicy.put("persistentPipeline", pipeline); String upToken = auth.uploadToken(bucket, key, 6000, putPolicy); System.out.println(upToken); return upToken; }
- 上传后进行单个文件转码,转成指定的格式。结果是空间中有两份文档,一份源,一份转码过的。官方文档参考https://developer.qiniu.com/dora/manual/1248/audio-and-video-transcoding-avthumb #解发持久化 小节
/** * 转码 * @param key 空间内的文件名 * @param newKey 另存的文件名 * @return */ public String transCoding(String key, String newKey) { String saveAs = UrlSafeBase64.encodeToString(bucket + ":" + newKey); String fops = "avthumb/mp4/ab/128k/ar/22050/acodec/libfaac/r/30/vb/300k/vcodec/libx264/s/320x240/autoscale/1/stripmeta/0|saveas/" + saveAs; //获取授权对象 Auth auth = Auth.create(accessKey, secretKey); //执行操作的管理对象 OperationManager operationMgr = new OperationManager(auth, new Configuration(Zone.zone0())); StringMap putPolicy = new StringMap(); putPolicy.put("pipeline", pipeline); // 如果没有指定会使用公共的,后果是可能等了很久都没处理 try { //执行转码和另存 操作 String persistentId = operationMgr.pfop(bucket, key, fops, putPolicy); System.out.println(persistentId); return persistentId; } catch (QiniuException e) { String errorCode = String.valueOf(e.response.statusCode); System.out.println(errorCode); e.printStackTrace(); } return ""; }
- 多码率自适应,可指定多种格式,优点是可以根据带宽自适应选择下载,缺点是会在空间中保存多份文档。官方参考文档 https://developer.qiniu.com/dora/manual/1245/multiple-rate-adaptive-transcoding-adapt
m3u8 在android,ios微信中可以播放,在pc微信中不可播,chrome, ff 不可播,手机浏览器(小米自带、uc、ios自带)可以播。/** * 多码率自适应 * @param key 空间内文件名 * @return */ public String adaptCoding(String key) { String saveAs = UrlSafeBase64.encodeToString(bucket + ":" + key + ".m3u8"); String fops = "adapt/m3u8/multiResolution/320:240,640:480/envBandWidth/200000,800000/multiVb/200k,1200k/hlstime/10|saveas/" + saveAs; //获取授权对象 Auth auth = Auth.create(accessKey, secretKey); //执行操作的管理对象 OperationManager operationMgr = new OperationManager(auth, new Configuration(Zone.zone0())); StringMap putPolicy = new StringMap(); putPolicy.put("pipeline", pipeline); // 如果没有指定会使用公共的,后果是可能等了很久都没处理 try { //执行转码和另存 操作 String persistentId = operationMgr.pfop(bucket, key, fops, putPolicy); System.out.println(persistentId); return persistentId; } catch (QiniuException e) { String errorCode = String.valueOf(e.response.statusCode); System.out.println(errorCode); e.printStackTrace(); } return ""; }