利用愛奇藝開放平臺實現視頻托管回調播放(一)——獲取授權
背景:
題庫軟件的教學視頻需要實現在線播放,由於技術水平和服務器配置的限制,如果把視頻放在自己服務器上會出現各種問題。訪問人數少的時候還可以勉強應付,臨近考試時,服務器壓力增大,視頻訪問延遲太大,有時根本無法正常播放,視頻一直處於緩沖狀態。被學生調侃“緩沖兩小時,播放五分鐘”。
如果要改善這種現狀,一方面是增強服務器的配置,另一方面優化軟件代碼。這兩個對我來說都太難,水平太菜,捉急。不過好在現狀互聯網足夠發達,想要實現什麽功能基本上都能找到現成的解決方案,兜兜轉轉發現了“愛奇藝開放平臺”。
簡介:
“愛奇藝開放平臺”提供“視頻托管”、“視頻播放”、“應用分發”等一系列的免費解決方案,其中“視頻托管”正是我所需要的解決方案。“視頻托管”是指把自己的視頻上傳托管到愛奇藝網站,並需要將托管的UGC視頻(用戶自制視頻)回調到自己的網站或APP免廣告播放,這真是瞌睡來枕頭了,正合我意。這樣就不用擔心視頻延遲問題了,除非是用戶本身帶寬問題。而且還可以免廣告播放。其實之前有把視頻上傳至優酷生成播放鏈接在APP內播放,但是需要看一段時間的廣告。想想有的視頻內容3分鐘左右,看個30秒的廣告,也是蛋疼的緊。
開始:
廢話不多說。要想使用“視頻托管”服務,首先要成為“愛奇藝開放平臺”的開發者。開發者有“個人”和“公司”兩種,根據實際情況選擇。申請通過後網頁上會出現“我的應用”選項,根據實際需求創建一個應用,應用一個賬戶只能創建一個,人工審核時間比較長。審核通過後會發放一個APP KEY 和 APP SECRET,這是後期開發必不可少的憑證,需小心保管。“視頻托管”應用簡單來說就是先上傳一些視頻到愛奇藝,然後利用愛奇藝平臺提供api來回調這些視頻到自己的網站或者APP去播放。這樣可以省去搭建視頻服務器的麻煩,代價是這些視頻在愛奇藝主站上都是公開的,其他人可以隨便看。“視頻托管”應用開發大致可以分成兩大塊:視頻上傳和視頻管理。你所回調的視頻內容必須來自使用對應APP KEY和APP SECRET上傳的視頻文件,僅使用個人賬號上傳的視頻內容是無法回調的。
視頻上傳:
視頻上傳有兩種方式:利用視頻托管的上傳接口上傳、利用合作方賬戶登錄“愛奇藝視頻助手”進行上傳。第一種方式也就是利用開放的API上傳接口來上傳視頻文件;第二種方式相對來說比較簡單,下載“愛奇藝視頻助手”,使用合作方賬戶登錄這個助手(“合作方賬戶”就是註冊開發者的賬戶)填寫審核通過應用的APP KEY 和 APP SECRET,之後上傳視頻文件就可以了。目前,第一種方式對我來說比較難,還沒摸索清楚,自覺水平太菜,等看完“異步編程”相關內容再來試試,先使用第二種方式來上傳視頻。
視頻管理:
對於“視頻托管”應用來說,“視頻管理”的主要內容是:獲取授權、刷新授權信息、獲取視頻狀態、獲取視頻信息、獲取視頻URL列表、刪除視頻。
正題
獲取授權:
獲取授權就是獲取一個訪問令牌(access_token),利用這個令牌去進行其他操作。
獲取授權的請求字符串:“https://openapi.iqiyi.com/api/iqiyi/authorize?client_id=APP_KEY&client_secret=APP_SECRET”。
其中APP_KEY 和 APP_SECRET是創建“視頻托管應用”審核通過後由愛奇藝開放平臺發放的。使用HTTP GET方式請求。
示例代碼如下:
1 /// <summary> 2 /// 獲取令牌(授權) 3 /// </summary> 4 private void GetAccessToken() 5 { 6 string requestAccessToken = string.Format("https://openapi.iqiyi.com/api/iqiyi/authorize?client_id={0}&client_secret={1}", mTestKey, mTestKeySecret); 7 8 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestAccessToken); 9 10 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 11 12 13 Stream receiveStream = response.GetResponseStream(); 14 15 StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); 16 17 string content = readStream.ReadToEnd(); 18 response.Close(); 19 readStream.Close(); 20 AuthorResult result = jss.Deserialize<AuthorResult>(content); 21 if (result != null && result.code == "A00000") 22 { 23 this.authorResult = true; 24 lb_msg.Text = result.msg; 25 lb_accessToken.Text = result.data.access_token; 26 this.access_token = result.data.access_token; 27 } 28 29 }
使用HttpWebRequest對象發送請求,對象默認請求方式是GET,如果需要設置其他請求方式,設置對象的Method屬性即可。
該請求返回的是如下結構的JSON字符串:
1 { 2 ‘code’: A0000, 3 ‘data’: 4 { 5 ‘access_token’: ACCESS_TOKEN, // 訪問令牌 6 ‘expires_in’ : 60, // 過期時間 7 ‘refresh_token’: REFRESH_TOKEN, // 刷新令牌 8 } 9 }
其中code表示狀態碼,含義如下:
A00000 | 成功 | |
Q00001 | 失敗 | |
A00007 | 系統錯誤 | |
A21324 | client_id或client_secret參數無效 |
access_token是訪問令牌,是進行後續操作的依據;expires_in表示訪問令牌的過期時間,以秒為單位;refresh_token表示刷新令牌,當令牌過期時可以使用這個刷新令牌,重新獲取access_token,詳見“刷新授權信息”。
疑問:過期時間在測試是返回的是一個9位數的數值,也就是上億。如果是以秒為單位那麽過期時間是一個非常大的值,利用測試的KEY和SECRET返回的過期時間大約是4年左右,對於普通應用應該完全足夠了;刷新令牌的意義在哪呢?如果令牌過期,完全可以重新獲取授權,沒必要利用這個操作吧。
利用愛奇藝開放平臺實現視頻托管回調播放(一)——獲取授權