保利威視頻播放


保利威視頻播放

首先上線播放視頻容易出的問題就是下載,以及盜錄的問題,保利威視提供的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()
polyv.py
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())
]
urls.py
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")
views.py
<cross-domain-policy>
<allow-access-from domain="*.polyv.net"/>
</cross-domain-policy>
跨域的html文件

 

特別注意: 

  不能用Response 只能用HttpResponse

  以及代碼中哪些字符串加密成sign


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM