保利威視頻播放
首先上線播放視頻容易出的問題就是下載,以及盜錄的問題,保利威視提供的API能夠幫助我們解決這個問題~
解決下載的問題就是通過加密視頻的形式,解決盜錄是通過跑馬燈的形式來實現的,那么我們來看下文檔~到底要怎么做
注冊賬號,上傳視頻等
注冊一個保利威的賬號得到user_id以及secretKey
網站上還有上傳以及視頻設置等功能~~
加密以及跑馬燈功能的實現
注意: 一定要仔細閱讀文檔~~特別是下面PHP代碼的例子~~類比着實現~~
個人認為保利威文檔寫的不太清晰~一定要細心~~~~
播放加密視頻的流程
1--播放加密視頻需要在保利威視頻播放器里加一個playsafe的參數
2--playsafe參數的值是token 也可以是一個function 這個function有兩個參數
一個是vid 一個是next 這個next方法必須被執行~ next(token) 而且要把token當做參數
3-- 那這個token到底是什么呢?
這個token需要我們像保利威的接口發POST請求獲取~
接口地址是 https://hls.videocc.net/service/v1/token ~文檔中有~
發送POST請求帶的參數是文檔要求的~
如果攜帶的參數對~這個接口會給我們返回驗證通過的token~
我們把token放入播放器的playsafe就可以播放了~~
播放跑馬燈視頻
播放跑馬燈視頻要求先必須用新的播放器~也就是引入新的js~
還有要在視頻設置里配置一個回調的url~~
1--使用新的播放器去播放視頻的時候,如果視頻是授權跑馬燈的,
保利威會默認向你提供的回調接口發送GET請求~
2-- GET請求會攜帶一些參數,需要我們這個接口返回文檔要求的信息~~
3-- 按照文檔的實例來編寫接口~成功后就可以播放視頻~並且攜帶跑馬燈~

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src='https://player.polyv.net/script/polyvplayer.min.js'></script> <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script> </head> <body> <div id="player"></div> <script> var player = polyvObject('#player').videoPlayer({ wrap: '#player', width: 800, height: 533, forceH5:true , vid: '03b56854c0e149a81c1d6258be4d64c2_0', // vid: '03b56854c063c2132bd7de277de36e74_0', code: 'myRandomCodeValue', // 向后端發送請求獲取加密的token playsafe: function (vid, next) { console.log(vid); axios.request({ url: "http://127.0.0.1:8002/api/course/polyv", method: "POST", data: { vid: vid } }).then(function (data) { console.log(data) next(data.data) }) } }); </script> </body> </html>

import json import time import requests import hashlib from django.conf import settings class PolyvVideo(object): USER_ID = settings.VIDEO_CONFIG["POLYV"]["USER_ID"] SECRET_KEY = settings.VIDEO_CONFIG["POLYV"]["SECRET_KEY"] def get_verify_data(self, vid, remote_addr, uid=None, username="", extra_params="HTML5"): """獲取加密視頻播放數據 Parameters ---------- vid : string 視頻 `vid` remote_addr: dict 請求地址 uid: string 用戶UID username: int 用戶username extra_params: string 擴展參數 Returns ------- string """ time_stamp = int(time.time() * 1000) # 加密數據 sign_data = { "userId": self.USER_ID, "videoId": vid, "ts": time_stamp, "viewerIp": remote_addr, "viewerId": uid, "viewerName": username, "extraParams": extra_params } # 數據排序 ordered_data = sorted( ( (k, v if not isinstance(v, dict) else json.dumps(v, separators=(',', ':'))) for k, v in sign_data.items() ) ) # 拼接加密數據 sign_string = "{}{}{}".format( self.SECRET_KEY, "".join(["{}{}".format(item[0], item[1]) for item in ordered_data]), self.SECRET_KEY, ) # 取大寫的MD5值 sign_data.update({"sign": self.generate_md5_num(sign_string).upper()}) # 請求可以播放視頻的憑證 res = requests.post( url="https://hls.videocc.net/service/v1/token", headers={ "Content-type": "application/x-www-form-urlencoded" }, data=sign_data ).json() data = {} if isinstance(res, str) else res.get("data", {}) return { "token": data.get("token"), # "sign": self.generate_md5_num("{}{}{}".format(self.SECRET_KEY, vid, time_stamp)), # "time_stamp": time_stamp } def generate_md5_num(self, value): return hashlib.md5(value.encode()).hexdigest() def get_play_key(self, vid, username, code, status, t): """獲取授權跑馬燈播放 `key` Parameters ---------- vid : string 視頻 `vid` username: dict 響應跑馬燈展示 code: string 自定義參數 status: int 是否可播放, 1、可播放 2、禁播 t: string 時間戳 Returns ------- string """ return self.generate_md5_num("vid={}&secretkey={}&username={}&code={}&status={}&t={}".format( vid, self.SECRET_KEY, username, code, status, t )).lower() @staticmethod def get_resp(status, username, sign, msg="授權暫未通過"): res_str = { "status": status, "username": username, "sign": sign, "msg": msg, "fontSize": "18", "fontColor": "0xFF0000", "speed": "50", "filter": "on", "setting": "2", "alpha": "0.7", "filterAlpha": "1", "filterColor": "0x3914AF", "blurX": "2", "blurY": "2", "tweenTime": "1", "interval": "3", "lifeTime": "3", "strength": "4", "show": "on" } return res_str polyv_video = PolyvVideo()

urlpatterns = [ url(r'^admin/', admin.site.urls), # 課程模塊的路由分發 url(r'^api/course/', include("course.urls")), url(r'^crossdomain.xml', test_bolyv), ] // courseAPP下的urls.py # by gaoxin from django.conf.urls import url, include from .views import CourseListView, CourseCategoryView, CourseDetailView, CourseChapterView from .views import CourseCommentView, OftenAskedQuestionView, polyv_demo from .video_view import PolyvView # 在項目路由下做了一層分發 # url(r'^api/course/', include("course.urls")), urlpatterns = [ url(r"^$", CourseListView.as_view()), url(r"^category$", CourseCategoryView.as_view()), url(r"^detail/(?P<pk>\d+)$", CourseDetailView.as_view()), url(r"^(?P<pk>\d+)/chapters$", CourseChapterView.as_view()), url(r"^(?P<pk>\d+)/comment$", CourseCommentView.as_view()), url(r"^(?P<pk>\d+)/often-asked-question$", OftenAskedQuestionView.as_view()), # 獲取加密數據播放視頻post請求 # 獲取授權跑馬燈回調的get接口 url(r"^polyv$", PolyvView.as_view()) ]

from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from django.http import HttpResponse from utils.polyv import polyv_video from utils.authentication import MyAuth import json class PolyvView(APIView): def post(self, request): vid = request.data.get("vid") remote_addr = request.META.get("REMOTE_ADDR") user_id = 1 user_name = "gaoxin" verify_data = polyv_video.get_verify_data(vid, remote_addr, user_id, user_name) return Response(verify_data["token"]) def get(self, request, *args, **kwargs): vid = request.query_params.get("vid", "") code = request.query_params.get("code", "") t = request.query_params.get("t", "") callback = request.query_params.get("callback", "") user_name = "peng" status = 1 # username, code, status, t sign = polyv_video.get_play_key(vid, user_name, code, status, t) print(sign) res_str = polyv_video.get_resp(int(status), user_name, sign) res_str = json.dumps(res_str, ensure_ascii=False) if callback != "": ret = callback + "(" + res_str + ")" else: ret = res_str print(ret) return HttpResponse(ret) # 解決跨域 def test_bolyv(request): return render(request, "bolyv_test.html")

<cross-domain-policy> <allow-access-from domain="*.polyv.net"/> </cross-domain-policy>
特別注意:
不能用Response 只能用HttpResponse
以及代碼中哪些字符串加密成sign