加密的视频:
一:python后端需要生成token
token计算规则
名词解释:
- userId: 百度云用户唯一标识,可在百度云管理控制台账号基本信息中得到,32位字符串。
- userKey:用户密钥,是AES-128内容密钥,用于对MediaId和ExpirationTime组成的串进行加密。长度为16字节,用32位十六进制数表示。可在百度云VOD管理控制台中设置和更新。
- signature: 签名,是用UserKey给MediaId和ExpirationTime加密生成的字符串。长度为32字节,用64位十六进制数表示。
- mediaId:百度云VOD中媒资的唯一标识。
- expirationTime:Signature的过期时间,是一个unix时间戳,以秒为单位。
- token:由Signature_UserId_ExpirationTime组成的字符串。
- HMAC-SHA-256:签名算法,详见https://tools.ietf.org/html/rfc4868
token的生成方法:
- 生成签名signature = HMAC-SHA-256(userKey,String.format("/%s/%s", mediaId, expirationTime),sample code见HMAC-SHA-256加密算法 Sample Code
- 利用下划线(_) 连接signature,userId,expirationTime组合成token = String.format(“%s_%s_%s”, signature, userId,expirationTime)
代码如下
urlpatterns = [
path("course_token", view.course_token)
]
def course_token(request): """ 百度点播的token """ video_url = request.GET.get('video_url') # 过期时间 expiration_time = int(time.time()) + 2 * 60 * 60 USER_ID = settings.BAIDU_CLOUD_USER_ID # 控制台-用户中心-用户ID USER_KEY = settings.BAIDU_CLOUD_USER_KEY # 音视频点播服务-全局设置-发布设置-安全设置-user key # file=http://xxx/xxxxx/xxxx/yyyyyyy.m3u8 extension = os.path.splitext(video_url)[1] # .m3u8 # 'mda-igjsr8g7z7zqwnav.m3u8'.replace('.m3u8', '') = 'yyyyyyy' media_id = video_url.split('/')[-1].replace(extension, '') # unicode->bytes=unicode.encode('utf-8')bytes key = USER_KEY.encode('utf-8') message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8') signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest() token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time) print('token:', token) return restful.result(data={'token': token})
二:前端
1.播放页面需要加载
前三个文件下载地址:http://sdk.bce.baidu.com/media-sdk/Baidu-T5Player-SDK-Web-v3.4.0.zip
<script src="{% static 'videojs/video.min.js' %}"></script> <script src="{% static 'videojs/videojs-contrib-hls.min.js' %}"></script> <script src="{% static 'videojs/videojs-contrib-quality-levels.min.js' %}"></script>
<script type="text/javascript" src="https://cdn.bdstatic.com/jwplayer/latest/cyberplayer.js"></script> # 该文件提供点击播放功能,播放的div盒子格式如下 <script src="{% static 'js/course_detail.js' %}"></script>
<div class="video-container"> <span hidden data-video-url="{{ course.video_url }}" data-cover-url="{{ course.cover_url }}"></span> <div id="playercontainer"></div> </div>
js代码
$(function () { var span = $(".video-container span"); var video_url = span.attr("data-video-url"); var cover_url = span.attr('data-cover-url'); var player = cyberplayer("playercontainer").setup({ '100%', height: '100%', file: video_url, image: cover_url, autostart: false, stretching: "uniform", repeat: false, volume: 100, controls: true, // primary: 'flash', flash优先 tokenEncrypt: "true", // 点击头像 安全中心 AccessKey ak: 'xxxxxxxxxxxxxxxxxx' }); player.on("beforePlay",function (e) { // 不是m3u8格式的就不是加密视频 if(!/m3u8/.test(e.file)){ return; } xfzajax.get({ 'url': '/course/course_token/', 'data': { 'video_url': video_url }, 'success': function (result) { if(result['code'] === 200){ var token = result['data']['token']; console.log('token:', token); player.setToken(e.file,token); }else{ window.messageBox.showError('token获取错误!'); } } }); }); });