python-html-百度云音视频点播服务

加密的视频:

一: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的生成方法:

  1. 生成签名signature = HMAC-SHA-256(userKey,String.format("/%s/%s", mediaId, expirationTime),sample code见HMAC-SHA-256加密算法 Sample Code
  2. 利用下划线(_) 连接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({
        width: '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获取错误!');
                }
            }
        });
    });
});

猜你喜欢

转载自www.cnblogs.com/tangpg/p/9396931.html