背景:

  题库软件的教学视频需要实现在线播放,由于技术水平和服务器配置的限制,如果把视频放在自己服务器上会出现各种问题。访问人数少的时候还可以勉强应付,临近考试时,服务器压力增大,视频访问延迟太大,有时根本无法正常播放,视频一直处于缓冲状态。被学生调侃“缓冲两小时,播放五分钟”。

  如果要改善这种现状,一方面是增强服务器的配置,另一方面优化软件代码。这两个对我来说都太难,水平太菜,捉急。不过好在现状互联网足够发达,想要实现什么功能基本上都能找到现成的解决方案,兜兜转转发现了“爱奇艺开放平台”。

 

简介:

  “爱奇艺开放平台”提供“视频托管”、“视频播放”、“应用分发”等一系列的免费解决方案,其中“视频托管”正是我所需要的解决方案。“视频托管”是指把自己的视频上传托管到爱奇艺网站,并需要将托管的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年左右,对于普通应用应该完全足够了;刷新令牌的意义在哪呢?如果令牌过期,完全可以重新获取授权,没必要利用这个操作吧。