.NET MVC對接POLYV——HTML5播放器播放加密視頻

官方參考文檔:http://dev.polyv.net/2017/videoproduct/v-playerapi/html5player/html5-docs/html

1.上傳視頻以前根據本身須要對所上傳的視頻進行加密設置html5

下面說一下對於加密視頻的H5播放 重點就在建立playsafe--獲取tokenajax

1. 頁面播放器加載c#

<div id="player"></div>
<script src="//player.polyv.net/script/player.js"></script>
<script>
    var player = polyvPlayer({
        wrap: '#player',
        width: 800,
        height: 533,
        vid: '7d9f485283907d3f2cf12a866910b682_7', 
        playsafe: function(vid, next) { //不是加密視頻playsafe不須要
            $.ajax({
                type: 'post',
                url: '服務端用來獲取token的url',
                data: {
                    vid: vid
                },
            }).done(function (res) {
                var result = JSON.parse(res);
                playsafe = result.data.token;
                next(playsafe);
            });
        }
    });
</script>

2. Token 獲取(服務端來獲取)api

  (1) 獲取客戶端IP服務器

  (2) 建立加密生成sign所需參數app

  (3) 將參數 useridvideoidtsvieweripvieweridviewernameextraparams 按照ASCII升序 key + value + ... + key + value拼接成字符串ide

  (4) 將拼接好的字符串首尾拼接secretkeypost

  (5) 將拼接好的字符串經過MD5加密 取大寫MD532位)ui

  (6) post請求polyv 獲取token

c#代碼以下:

 

public string GetPolyToken(string vid)
        {
            var userId = "7d9f485283"; // polyv 提供的服務器間的通信驗證
            var secret = "1NM4HdSS9P"; // polyv 提供的接口調用簽名訪問的key
            var ip = "112.53.65.101"; // 客戶端真實ip
            var timeStamp = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds).ToString();  // 毫秒級時間戳(13位)
            var viewerId = "12345"; //觀看者id
            var viewerName = "12345"; //用戶暱稱(中文須要urlencode('張三'))
            var extraParam = "HTML5"; //自定義參數
            // 1. 建立加密生成 sign 的所需參數
            Dictionary<string, string> parameters = new Dictionary<string, string>
            {
                {"userId", userId},
                {"videoId", vid},
                {"ts", timeStamp},
                {"viewerIp", ip},
                {"viewerId", viewerId},
                {"viewerName", viewerName},
                {"extraParams", extraParam}
            };
            // 2.將參數 userid、 videoid、 ts、 viewerip、 viewerid、 viewername、 extraparams 按照ASCII升序 key + value + ... + key + value 拼接成字符串 ascDicStr
            var ascDic = parameters.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value.ToString());
            var ascDicStr = "";
            foreach (var kv in ascDic)
            {
                ascDicStr += kv.Key + kv.Value;
            }
            // 3. 首尾拼接 secretkey
            var signStr = secret + ascDicStr + secret;
            // 4. 取大寫MD5(32位) eg:DFC38BAACA122385A055D99739834A6D
            var sign1 = MD5(signStr);
            var sign = sign1.Replace("-", "");
            // 5. 將生成的 sign 做爲參數一併傳給polyv用來獲取token
            parameters.Add("sign",sign);
            string serviceUrl = "https://hls.videocc.net/service/v1/token";
            //模擬 post 請求
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            Stream reqStream = null;
            request = (HttpWebRequest)WebRequest.Create(serviceUrl);
            request.Method = "post";    //設置爲post請求
            request.ReadWriteTimeout = 5000;
            request.KeepAlive = false;
            request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
            byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8"));   //使用utf-8格式組裝post參數
            reqStream = request.GetRequestStream();
            reqStream.Write(postData, 0, postData.Length);
            response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("gb2312"));
            string retString = streamReader.ReadToEnd();
            streamReader.Close();
            responseStream.Close();
            return retString;
        }

        //組裝請求參數
        private string BuildQuery(IDictionary<string, string> parameters, string encode)
        {
            StringBuilder postData = new StringBuilder();
            bool hasParam = false;
            IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
            while (dem.MoveNext())
            {
                string name = dem.Current.Key;
                string value = dem.Current.Value;
                // 忽略參數名或參數值爲空的參數
                if (!string.IsNullOrEmpty(name))
                {
                    if (hasParam)
                    {
                        postData.Append("&");
                    }
                    postData.Append(name);
                    postData.Append("=");
                    if (encode == "gb2312")
                    {
                        postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312")));
                    }
                    else if (encode == "utf8")
                    {
                        postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
                    }
                    else
                    {
                        postData.Append(value);
                    }
                    hasParam = true;
                }
            }
            return postData.ToString();
        }
 
        /// <summary>
        /// MD5 hash加密
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string MD5(string s)
        {
            var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            var result = BitConverter.ToString(md5.ComputeHash(UnicodeEncoding.UTF8.GetBytes(s.Trim())));
            return result;
        }
相關文章
相關標籤/搜索