官方參考文檔: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) 將參數 userid、 videoid、 ts、 viewerip、 viewerid、 viewername、 extraparams 按照ASCII升序 key + value + ... + key + value拼接成字符串ide
(4) 將拼接好的字符串首尾拼接secretkeypost
(5) 將拼接好的字符串經過MD5加密 取大寫MD5(32位)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; }