最近項目在搞視頻播放,使用的是騰訊雲點播,這裏作一個使用總結~css
項目中涉及到上傳視頻,播放視頻,以及視頻安全等,雲點播這幾個功能都有,接入起來也是比較順滑~node
項目第一步,固然是要上傳視頻啦~ios
這裏使用的是js的sdk,詳情查看 Web 端上傳 SDKweb
使用的方法比較簡單,下面是示例代碼:axios
// 引入js sdk
<script src="//unpkg.com/vod-js-sdk-v6"></script>
// 獲取簽名,這裏的簽名須要在後端計算,由於涉及帳號安全信息
function getSignature() {
return axios.post(url).then(function (response) {
return response.data.signature;
})
};
// 初始化
const tcVod = new TcVod.default({
getSignature: getSignature // 前文中所述的獲取上傳簽名的函數
})
// 上傳視頻
const uploader = tcVod.upload({
videoFile: videoFile, // 視頻,類型爲 File
})
// 查看上傳進度
uploader.on('video_progress', function(info) {
console.log(info.percent) // 進度
})
// 上傳完成回調
uploader.done().then(function (doneResult) {
// deal with doneResult
})
複製代碼
getSignature用於獲取上傳簽名,樓主的項目後臺使用的是node,因此提供一下node的版本。詳情可查看 客戶端上傳簽名後端
const querystring = require('querystring');
const crypto = require('crypto');
router.get('/getSignature', function(req, res, next) {
// 肯定 app 的雲 API 密鑰
let secret_id = SecretId;
let secret_key = SecretKey;
// 肯定簽名的當前時間和失效時間
let current = parseInt((new Date()).getTime() / 1000, 10);
let expired = current + 86400; // 簽名有效期:1天
// 向參數列表填入參數,QCVB_DrmProcessFile爲加密轉碼模板,
let arg_list = {
secretId: secret_id,
currentTimeStamp: current,
expireTime: expired,
random: Math.round(Math.random() * Math.pow(2, 32)),
// procedure爲配置任務,視頻上傳完成後,點播後臺就會執行相應的操做
// 這裏設置了視頻轉碼 以及 加密操做
procedure: 'QCVB_SimpleProcessFile({20,30,40}, 0, 10, 10)'
};
// 計算簽名
let orignal = querystring.stringify(arg_list);
let orignal_buffer = new Buffer(orignal, 'utf8');
let hmac = crypto.createHmac('sha1', secret_key);
let hmac_buffer = hmac.update(orignal_buffer).digest();
let signature = Buffer.concat([hmac_buffer, orignal_buffer]).toString('base64');
let response = {
ret: 0,
data: {
signature: signature
}
};
return res.send(response);
});
複製代碼
視頻上傳完成以後,咱們就能夠播放視頻了~安全
播放視頻咱們使用的是 點播超級播放器 ,是點播專屬的播放器,直接配置fileID & fileId便可播放點播的視頻。網絡
使用方式也是至關簡單app
// 引入播放器
<link href="//imgcache.qq.com/open/qcloud/video/tcplayer/tcplayer.css" rel="stylesheet">
<script src="//imgcache.qq.com/open/qcloud/video/tcplayer/lib/hls.min.0.8.8.js"></script>
<script src="//imgcache.qq.com/open/qcloud/video/tcplayer/tcplayer.min.js"></script>
// 播放器容器
<video id="player-container-id" width="414" height="270" preload="auto" playsinline webkit-playsinline>
</video>
// 初始化播放器
var player = TCPlayer('player-container-id', {
fileID: fileID,
appID: appID
});
複製代碼
在上傳簽名的時候,咱們作了預設的處理,procedure參數dom
用戶上傳的視頻格式千差萬別,對視頻進行轉碼,將視頻轉爲統一的格式,這種在播放的時候就能夠避免因視頻格式的問題致使不能播放。
加密轉碼與轉碼的不一樣之處在於,視頻格式通過加密處理,播放過程須要進行解密才能播放,這裏能夠很好的作到視頻安全~
不過,點播這裏提供的加密只針對hls封裝格式的視頻,因此轉碼的配置也要作hls轉碼,其餘的就沒有效果哦。
用戶網絡有快有慢,hls的masterplaylist能夠有效解決因網絡帶來的播放問題。
hls添加了masterplaylist以後,在播放過程當中,能夠根據網絡的快慢,自動切換視頻清晰度,帶來更好的用戶體驗。
referer防盜鏈,根據網站referer進行限制,開啓白名單referer進行防盜處理。
key防盜鏈,經過在控制檯配置&開啓key防盜鏈,用戶播放視頻時須要傳key簽名進行校驗,校驗失敗則拒絕返回視頻,達到防盜效果。
key防盜鏈相對於referer防盜鏈更加安全,畢竟referer能夠僞造。
下面提供的是node的實現:
const crypto = require('crypto');
router.get('/getKeySign', function(req, res, next) {
// 肯定簽名的當前時間和失效時間
let current = parseInt((new Date()).getTime() / 1000, 10);
let expired = current + 86400; // 簽名有效期:1天
// 向參數列表填入參數
let arg_list = {
KEY: config.video.key,
appId: req.query.appId,
fileId: req.query.fileId,
t: expired.toString(16),
us: Math.round(Math.random() * Math.pow(2, 32)).toString()
};
// 計算簽名
let orignal = '';
for (let item in arg_list) {
orignal += arg_list[item];
}
let md5 = crypto.createHash('md5');
let md5_buffer = md5.update(orignal).digest('hex');
let signature = md5_buffer.toString('base64');
let response = {
ret: 0,
data: {
t: arg_list.t,
us: arg_list.us,
sign: signature
}
};
return res.send(response);
});
複製代碼
hls視頻加密,視頻加密針對的防盜用戶實際上是有權限查看視頻的客戶,若是沒有對視頻內容進行加密,用戶只要獲取到咱們的視頻,其實就能夠將視頻下載到本地進行播放,而hls視頻加密,就是針對這種場景。就算用戶拿到了視頻數據,也不能輕易破解播放,那麼,加密的目的就達到了~
這塊相對來講比較複雜,詳細可查看 視頻加密
咱們先來看幾個標識
那麼,咱們要作的處理實際上是比較簡單的
總體上傳、加密轉碼、播放加密視頻的流程以下:
前段時間作了比較多的視頻處理,因此總結了一下,加深本身的理解,同時也但願對用到的人有所幫助~