视频播放实时记录日志并生成XML文件

需求描述:

在JWPlayer视频播放过程当中,要求实时记录视频观看者播放、暂停的时间,并记录从暂停到下一次播放时所通过的时间。将全部记录保存为XML文件,以方便数据库的后续使用。前端

 

实现过程:

尝试1:使用JS操做文件

网上查阅资料得知JS有ActiveXObject(仅用于IE和IE内核浏览器)以及XmlHttpRequest(通用)能够操做XML文件,但实际发现JS并无写入文件的权限,所以放弃。数据库

尝试2:使用ASPX页面实现网页本地保存

一开始只考虑使用单个ASPX页面,在后台的.cs文件中实现存取,可是后来发现TextBox.TextChanged事件并非实时触发,也是须要刷新页面的,另外刷新页面以后视频会从新加载,达不到实时记录的目的。所以一样放弃这种方案,考虑使用AJAX配合ASHX通常处理程序来实现。浏览器

尝试3:AJAX+ASHX直接存取

原本的构想是:前端页面经过AJAX方式访问到ASHX中的ProcessRequest()方法,经过XmlDocument类及其相关操做生成XML文件,最后经过XmlDocument.Save()方法保存在服务器上。可是实际运行的过程当中发现生成的XML文件只保存了最后的一次播放/暂停的时间。经过查阅资料、上网查询以及本地调试后得知,AJAX访问后台处理过程每次都会从新构造请求,而处理请求的逻辑中又包含了建立XML文件的过程,因而新的文件就将旧的文件覆盖了。所以没法采用这种直接存取的方式,而且因为要求实时记录,因此也不能采用Session或是Cache等保存这些时间值,换句话说,不能经过前端页面的.cs文件中去记录cache。所以有了下面的最终方案。服务器

最终方案:AJAX+Stream+ASHX间接存取

既然没法保存在内存中,那么就把它拿出来。基于这种考虑,想到了经过日志文件记录所需记录的时间值(字符串),最后再总体输出成XML文件。调试

序列图以下:日志

总结

Ajax每次请求后台处理过程时会从新建立一个HttpHandler,使得一切与该HttpHandler所关联的对象所有都被从新建立,所以作不到将所要构建的对象保存在内存中。视频

解决方案是:一、经过Http Session或者Cache等方式暂存数据,这种方法适用于非实时更改的,相对固定的数据。二、经过外部文件转移数据,即适用于非实时数据也适用于实时数据,缺点是若是请求的数量比较多,文件大小会快速增加,须要按期清除多余的文件,维护上要麻烦一点。对象

进一步要解决的问题

如何实现按用户(用户ID或观看视频的IP等信息)分别记录视频进度blog

相关文章
相关标签/搜索