在部署使用Open edX的过程中,一个普遍的问题是:视频放在哪儿?

Open edX本身并不是设计来存储视频的。edX本质上提供了一套学习工具和学习过程,而一些比较专业化的资源是置于外部的,比如视频以及机器学习、自动评分等等。

CMS中有提供文件上传功能。如果你的edX仅仅是提供给少数人用的,你也可以把视频放到这里,并在视频模块中输入相应的链接。你需要考虑的是edX主机的空间是否足够存储视频;视频播放带来的cpu内存损耗能否能让edX代码正常的运行;edX主机的网络带宽能支持播放多少并发?

在公网上的edX可以直接购买视频云服务,例如腾讯云、阿里云等。服务商保证了视频的可用性和播放速度,也不会对edX主机的性能造成影响。还可以根据视频的需求扩展资源。如果不想在视频投入成本,也可以使用@wwj的优酷视频Xblock。当然,会有优酷广告(没有免费的午餐)。

场景

有几种场景需要搭建内网视频服务器来配合edX:

  • 内网是和外网隔离的,用户不能使用外网视频云。
  • 内网和外网链接的速度有限,而且内网有足够的计算存储资源用来存储视频。
  • 只希望视频资源在内网可访问。

一般这种场景出现在教育机构和大型企业中。此时应该搭建专门的视频服务器。

选择视频格式

目前最常见的视频播放格式就是FLV和MP4。对应的有flash播放器以及HTML5播放器。

由于flash播放器的兼容性以及未来flash技术的前景,不建议选择这种格式。

目前HTML5播放技术比较成熟,但仍存在一些兼容问题,具体可见 http://www.jwplayer.com/html5/

根据上面链接的资料,H264格式是受支持最广的,所以一般应该用这个格式来编码课程视频。

视频版权保护DRM方面,可见这个讨论 http://stackoverflow.com/questions/2983555/is-there-a-way-to-use-drm-on-html5-video,W3C已经提出了EME(Encrypted Media Extensions)标准,并已经得到支持。不过目前还并不能在HTML5中很方便的进行视频版权保护。

搭建视频服务器

比较简单的方案,自行搭建Nginx来提供视频播放。

Nginx中有一些和视频相关的模块:

http://nginx.org/en/docs/http/ngx_http_flv_module.html

The ngx_http_flv_module module provides pseudo-streaming server-side support for Flash Video (FLV) files.

It handles requests with the start argument in the request URI’s query string specially, by sending back the contents of a file starting from the requested byte offset and with the prepended FLV header.

http://nginx.org/en/docs/http/ngx_http_mp4_module.html

The ngx_http_mp4_module module provides pseudo-streaming server-side support for MP4 files. Such files typically have the .mp4, .m4v, or .m4a filename extensions.

Pseudo-streaming works in alliance with a compatible Flash player. The player sends an HTTP request to the server with the start time specified in the query string argument (named simply start and specified in seconds), and the server responds with the stream such that its start position corresponds to the requested time, for example:

http://nginx.org/en/docs/http/ngx_http_hls_module.html

The ngx_http_hls_module module provides HTTP Live Streaming (HLS) server-side support for MP4 and MOV media files. Such files typically have the .mp4, .m4v, .m4a, .mov, or .qt filename extensions. The module supports H.264 video codec, AAC and MP3 audio codecs.

可见ngx_http_flv_module和ngx_http_mp4_module都是为了flash播放器而准备的,主要都是提供了视频定位的功能,让flash播放器可以直接定位到视频中的时间点,根据指定的参数start。所以这两个模块如果不用flash播放器就无需安装。其中pseudo-streaming是一种伪流技术,实现了服务器端和flash播放器之间的通信。

ngx_http_hls_module提供了对于HLS的支持。HLS是苹果定义的一个基于HTTP的流媒体传输协议,可实现流媒体的直播和点播。如不打算用HLS对课件进行编码,这个模块也可以不装。

那么不安装附加的组件是否就不可以在HTML5播放器对视频进行时间定位?W3C有一个标准Media Fragments URI http://www.w3.org/TR/media-frags/,可以实现浏览器传递时间参数。可以在浏览器输入 课程视频来测试。在视频后面加入不同的参数:

http://cdn.cs50.net/2014/fall/lectures/0/w/week0w-360p.mp4#t=1000

http://cdn.cs50.net/2014/fall/lectures/0/w/week0w-360p.mp4#t=2000

这里http://jsfiddle.net/s6dkZ/也展示了使用js来定位视频时间的方式。

视频集群负载均衡

对于一个机构内部的在线课程视频服务,需要经过计算来确定视频集群的数量。这里给出一个比较粗放的计算方法。

首先确定用户数量。这里有几个概念:总用户数/在线用户数/并发数。例如一个学校内部有10000个学生用户,在线用户可能为1000人,同时并发观看视频的有200人。具体的数量关系目前并没有统计数据,需要经过调查及观察,在不同时间段还会有不同的峰值,比如晚上学生下课后观看人数比白天会多得多。

其次确定视频的码率,几种常见的码率:
流畅:码率—256kbps,分辨率—480360,俗称360P
高清:码率—512kbps,分辨率—640
480,俗称480P
超清:码率—1024kbps,分辨率—1280*720,俗称720P

以720p为例,同时并发200人,并发流量为200*1024kbps=204800kbps=204mbps。再综合考虑服务器磁盘性能和网卡性能,对应交换机的性能,估算出需要什么规模的视频集群。

nginx视频负载均衡 http://nginx.org/en/docs/http/load_balancing.html