視頻播放實時記錄日誌並生成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

相關文章
相關標籤/搜索