1.VOD介绍
云点播(Video on Demand,VOD)依托于腾讯音视频技术平台打造多场景融合的音视频点播服务,为客户提供易用、稳定的云端一体化解决方案。云点播支持多样上传 SDK,媒资管理,媒资处理,视频 AI,数据分析,播放器 SDK 等功能,仅需几分钟,用户就可以在云端获取和启用云点播服务,全面满足低延迟、高画质、高码率、多终端、视频安全等多场景业务需求。
2.使用
vod和cos不同,vod上传可使用javasdk,可使用其他方式,而播放或者修改删除等操作调用腾讯云提供的接口(SDK有点难找)
1.推荐对上传的视频进行加密
视频加密,加密之后,直接访问视频链接不能观看视频,需要使用超级播放器加appid+fileid+sign访问,其中sign是会过期的,本地生成方式会在下面给出
文件Id
推荐对视频进行转码
2.使用javaSDK上传
查看产品文档可知,腾讯云不支持流式上传,只支持本地文件或者拉取URl上传,所以需要先存为本地文件再上传,具体方式看下例
缺点:
多了一道中转过程,浪费时间,且这样一来,element-ui的上传组件进度条就会失效,因为进度条是根据上传到自己的服务器为依据的,而不是以实际的腾讯云上传完成为依据,
1.导入maven依赖
<!-- 腾讯云vod-->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>vod_api</artifactId>
</dependency>
<!-- 腾讯云javaSDK,就不需要调用腾讯云的url接口了,就可以自己写接口-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
</dependency>
<!-- 用来生成腾讯云的加密签名-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
</dependency>
2.存为本地文件方法
/**
* 保存文件至本地,因为腾讯云不支持流式上传,所以只能先存为文件中转
*
* @param multipartFile
* @return
* @throws Exception
*/
public String saveFileToLocal(MultipartFile multipartFile) throws Exception {
//生成基础路径,路径为类路径下
//E:/java/javaProgramFile/guli_parent/service/service_vod/target/classes/static/video
String basePath = ResourceUtils.getURL("classpath:").getPath() + "static/video";
//判断当前文件夹存不存在
File file = new File(basePath);
if (!file.exists()) {
file.mkdirs();
} //获取上传的文件名
String fileName = multipartFile.getOriginalFilename();
//生成最终路径,File.separator:分隔符
String finalPath = basePath + File.separator + fileName;
//将文件保存到对应文件夹
multipartFile.transferTo(new File(finalPath));
return finalPath;
}
3.将本地文件上传至vod方法
/**
* 上传至腾讯云点播
*
* @param filePath
* @return
*/
public VodUploadResponse uploadFileToVod(String filePath) {
//初始化一个上传客户端对象
VodUploadClient client = new VodUploadClient(VodUtils.SECRET_ID, VodUtils.SECRET_KEY);
//构造上传请求对象
VodUploadRequest request = new VodUploadRequest();
request.setMediaFilePath(filePath); //视频地址,必须为本地路径,不支持 URL
// request.setCoverFilePath("/data/videos/Wildlife.jpg"); //指定封面,必须为本地路径,不支持 URL
request.setProcedure("SimpleAesEncryptPreset"); //指定上传后执行的任务流,任务流查看vod控制台,这里是视频加密模板
request.setConcurrentUploadNumber(5); //指定分片上传数,会把文件拆分成多个分片上传,更快
try {
//上传并获得视频id,此处地域只是请求的云服务器位置,不是视频的存储位置
VodUploadResponse response = client.upload(VodUtils.REGION, request);
log.info("腾讯云点播 FileId = {}", response.getFileId());
log.info("腾讯云点播 url = {}", response.getMediaUrl());
return response;
} catch (Exception e) {
// 业务方进行异常处理
log.error("腾讯云上传 Error", e);
return null;
}
}
4.service调用
public String uploadTencentVideo(MultipartFile file) {
try {
String filePath = saveFileToLocal(file);
VodUploadResponse response = uploadFileToVod(filePath);
String fileId = response.getFileId();
//上传完成后删除存在本地的文件
File path = new File(filePath);
if (path.exists()) {
path.delete();
}
return fileId;
} catch (Exception e) {
throw new GuliException(20001, "文件上传失败");
}
}
3.使用webSDK上传
1.与javaSDK的区别:
- javaSDK是属于服务端上传,不需要上传签名认证,web是客户端上传,需要签名认证
- javaSDK不支持流式上传,需先存为本地文件,浪费时间且会使进度条失效,web上传直接在前端将选择的文件使用腾讯提供的sdk上传,少一道中转,且不会使进度条失效
2.使用步骤:
1.后端提供签名服务接口,具体代码参考腾讯云文档
/**
* 获得上传签名
* @return
*/
@GetMapping("getSign")
public R getSign() {
String sign = vodService.getSign();
return R.ok().data("signature", sign);
}
2.编写service层
public String getSign() {
Signature sign = new Signature();
// 设置 App 的云 API 密钥
sign.setSecretId(VodUtils.SECRET_ID);
sign.setSecretKey(VodUtils.SECRET_KEY);
sign.setCurrentTime(System.currentTimeMillis() / 1000);
sign.setRandom(new Random().nextInt(java.lang.Integer.MAX_VALUE));
sign.setSignValidDuration(3600 * 24); // 签名有效期:1天
try {
String signature = sign.getUploadSignature();
log.info("signature : " + signature);
return signature;
} catch (Exception e) {
e.printStackTrace();
throw new GuliException(20001, "获取签名失败");
}
}
3.签名生成工具类。复制腾讯云文档即可
```java package com.guli.utils;
import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.util.Base64;
/**
上传签名工具类 */ public class Signature { private String secretId; private String secretKey; private long currentTime; private int random; private int signValidDuration; private static final String HMAC_ALGORITHM = “HmacSHA1”; //签名算法 private static final String CONTENT_CHARSET = “UTF-8”;
public static byte[] byteMerger(byte[] byte1, byte[] byte2) {
byte[] byte3 = new byte[byte1.length + byte2.length];
System.arraycopy(byte1, 0, byte3, 0, byte1.length);
System.arraycopy(byte2, 0, byte3, byte1.length, byte2.length);
return byte3;
}
// 获取签名 public String getUploadSignature() throws Exception {
String strSign = "";
String contextStr = "";
// 生成原始参数字符串
long endTime = (currentTime + signValidDuration);
contextStr += "secretId=" + java.net.URLEncoder.encode(secretId, "utf8");
contextStr += "¤tTimeStamp=" + currentTime;
contextStr += "&expireTime=" + endTime;
contextStr += "&random=" + random;
try {
Mac mac = Mac.getInstance(HMAC_ALGORITHM);
SecretKeySpec secretKey = new SecretKeySpec(this.secretKey.getBytes(CONTENT_CHARSET), mac.getAlgorithm());
mac.init(secretKey);
byte[] hash = mac.doFinal(contextStr.getBytes(CONTENT_CHARSET));
byte[] sigBuf = byteMerger(hash, contextStr.getBytes("utf8"));
strSign = base64Encode(sigBuf);
strSign = strSign.replace(" ", "").replace("\n", "").replace("\r", "");
} catch (Exception e) {
throw e;
}
return strSign;
}
private String base64Encode(byte[] buffer) {
Base64.Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(buffer);
}
public void setSecretId(String secretId) {
this.secretId = secretId;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public void setCurrentTime(long currentTime) {
this.currentTime = currentTime;
}
public void setRandom(int random) {
this.random = random;
}
public void setSignValidDuration(int signValidDuration) {
this.signValidDuration = signValidDuration;
} }
<a name="wdWxi"></a>
#### 4.前端下载并引入依赖
```javascript
// npm install vod-js-sdk-v6 之后,在页面中直接 import 引入,web上传到腾讯云点播
import TcVod from 'vod-js-sdk-v6'
5.使用自定义方法覆盖默认上传方式
<el-form-item label="上传视频">
<el-upload
:on-remove="handleVodRemove"
:before-remove="beforeVodRemove"
:on-exceed="handleUploadExceed"
:before-upload="BeforeUpload"
:file-list="fileList"
:http-request="uploadVideo"
:limit="1"
action
class="upload-demo">
<!-- :action="BASE_API+'/eduVod/video/uploadTencentVideo'"-->
<el-button size="small" type="primary">上传视频</el-button>
<el-tooltip placement="right-end">
<div slot="content">最大支持1G,<br>
支持3GP、ASF、AVI、DAT、DV、FLV、F4V、<br>
GIF、M2T、M4V、MJ2、MJPEG、MKV、MOV、MP4、<br>
MPE、MPG、MPEG、MTS、OGG、QT、RM、RMVB、<br>
SWF、TS、VOB、WMV、WEBM 等视频格式上传
</div>
<i class="el-icon-question"/>
</el-tooltip>
</el-upload>
<el-progress v-show="isShowProgress" :percentage="percent" :status="upLoadStatus"></el-progress>
</el-form-item>
6.自定义方法,复制腾讯云示例
getSign(){
return request ({
url: `/eduVod/video/getSign`,
method: 'get'
})
}
//获得后端生成的上传签名,请求自己的接口即可
getSign() {
return video.getSign().then((response) => {
return response.data.signature
})
}
//自定义的上传方法,覆盖率原来的上传方式,前端将文件上传至腾讯云
//param为upload组件
uploadVideo(param) {
const tcVod = new TcVod({
getSignature: this.getSign
})
const uploader = tcVod.upload({
mediaFile: param.file, // 媒体文件(视频或音频或图片),类型为 File
})
// 进度条
uploader.on('media_progress', (info) =>{
this.percent = info.percent*100
})
//上传完成执行的操作,doneResult.fileId会返回保存的id
uploader.done().then((doneResult)=>{
//..........
})
}
4.播放视频
播放视频推荐使用腾讯云的超级播放器
<link href="aaa.xxx.ccc/tcplayer.min.css" rel="stylesheet">
<!--如果需要在 Chrome 和 Firefox 等现代浏览器中通过 H5 播放 HLS 格式的视频,需要在 tcplayer.v4.2.1.min.js 之前引入 hls.min.0.13.2m.js。-->
<script src="aaa.xxx.ccc/libs/hls.min.0.13.2m.js"></script>
<!--播放器脚本文件-->
<script src="aaa.xxx.ccc/tcplayer.v4.2.1.min.js"></script>
<video id="player-container-id" width="414" height="270" preload="auto" playsinline webkit-playsinline>
</video>
var player = TCPlayer('player-container-id', { // player-container-id 为播放器容器 ID,必须与 html 中一致
fileID: '5285890799710670616', // 请传入需要播放的视频 fileID(必须)
appID: '1400329073' // 请传入点播账号的 appID(必须)
});
示例代码
```javascript <!DOCTYPE html>
<a name="Kg1c8"></a>
## 5.其他操作
<a name="JOSsG"></a>
### 1.调用接口方式

<a name="p82GF"></a>
### 2.使用javaSDK方式
具体操作示例可以查看腾讯云JavaSDK的[github地址](https://github.com/TencentCloud/tencentcloud-sdk-java)<br />接口参数可以参考接口方式的文档
<a name="DQrrA"></a>
#### 1.导入maven,上方已经给出
<a name="oKezM"></a>
#### 2.删除操作
```java
/**
* 删除vod中指定文件
* @throws Exception
*/
@Test
public void deleteFile() throws Exception{
//实例化一个认证对象
Credential client = new Credential("xxxxxxxxxx", "xxxxxxx");
//实例化要请求产品的client对象
VodClient vodClient = new VodClient(client,"ap-chengdu");
DeleteMediaRequest deleteMediaRequest = new DeleteMediaRequest();
deleteMediaRequest.setFileId("xxxxxxxxxxxx");
DeleteMediaResponse deleteMediaResponse = vodClient.DeleteMedia(deleteMediaRequest);
//System.out.println(deleteMediaResponse);
}
3.如果需要加密操作,需要生成签名的话
/**
* 生成腾讯云的加密签名
*/
@Test
public void createSign(){
Integer AppId = 1255566655; //账号 appId
String FileId = "4564972818519602447"; //文件 ID
Integer CurrentTime = 1589448067; //派发签名当前 Unix 时间戳
Integer PsignExpire = 1589548067; //派发签名到期 Unix 时间戳,不填表示不过期
String UrlTimeExpire = "5ebe9423"; //url到期时间
String Key = "24FEQmTzro4V5u3D5epW"; //控制台中key盗链生成的key
HashMap<String, String> urlAccessInfo = new HashMap<String, String>();
urlAccessInfo.put("t", UrlTimeExpire);
try {
Algorithm algorithm = Algorithm.HMAC256(Key);
String token = JWT.create().withClaim("appId", AppId).withClaim("fileId", FileId)
.withClaim("currentTimeStamp", CurrentTime).withClaim("expireTimeStamp", PsignExpire)
.withClaim("urlAccessInfo", urlAccessInfo).sign(algorithm);
System.out.println("token:" + token);
} catch (JWTCreationException exception) {
// Invalid Signing configuration / Couldn't convert Claims.
}
}