官方參考文檔:http://dev.polyv.net/2017/videoproduct/v-playerapi/html5player/html5-docs/
1.上傳視頻之前根據自己需要對所上傳的視頻進行加密設置

下面說一下對於加密視頻的H5播放 重點就在創建playsafe--獲取token
1. 頁面播放器加載
<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 獲取(服務端來獲取)
(1) 獲取客戶端IP
(2) 創建加密生成sign所需參數
(3) 將參數 userid、 videoid、 ts、 viewerip、 viewerid、 viewername、 extraparams 按照ASCII升序 key + value + ... + key + value拼接成字符串
(4) 將拼接好的字符串首尾拼接secretkey
(5) 將拼接好的字符串通過MD5加密 取大寫MD5(32位)
(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;
}
