楊公義
(北京大學 教師教學發展中心,北京 100871)
基于Flash流媒體服務器的北大視頻資源庫的設計與實現
楊公義
(北京大學 教師教學發展中心,北京100871)
自主研發視頻資源庫更易于和校內第三方系統集成。北大采用Flash流媒體服務器研發了視頻資源庫,功能模塊包括用戶管理,院系管理,課程管理,視頻管理。攝像機的直播流能通過分布式轉碼自動存入北大視頻資源庫。后期經過非線性編輯的教學錄像能通過自主研發的大文件上傳控件從前臺以web方式存入北大視頻資源庫。通過流權限控制保證了只有經過授權的攝像機才能向服務器端發送視頻流,只有經過授權的第三方系統才能引用流媒體服務器的視頻資源。北大視頻資源庫為校內七大系統提供RTMP協議的視頻流支持、元數據管理和內容發布。
視頻資源庫;流媒體服務器;大文件上傳控件;流權限控制
本文著錄格式:楊公義. 基于Flash流媒體服務器的北大視頻資源庫的設計與實現[J]. 軟件,2016,37(8):05-10
視頻資源庫是高校網絡教學、遠程教育、公開課等系統的重要基礎。在北大自主研發視頻資源庫之前,北大曾經使用過Real公司“Helix Server”和確然公司的“視頻服務系統”。隨著Adobe公司的Flash流媒體服務器的興起,Real流媒體技術的不足之出明顯暴露出來,比如它要求客戶端必須安裝RealPlayer,同時RealPlayer會和客戶端的Flash Player沖突,而客戶端90%以上的用戶已經安裝了Flash Player。北大大學英語網絡測試表明并發用戶過多時Helix Server服務器會死機。
確然公司的“視頻服務系統”因為使用的是私有流媒體協議,技術上相對封閉,二次開發難度較大,委托公司開發費用太高。而北大教學網采用的是Blackboard,而Blackboard中缺少流媒體及視頻管理模塊,教學視頻在網絡教學中具有圖文內容所不可替代的作用。通過自主研究并與Blackboard合作,北大具備了Blackboard的二次開發能力,同時北大視頻公開課、北大網絡教育電視臺、北大講座網等七大系統也需要視頻資源庫的支持,為此,我們基于Adobe Flash流媒體服務器自主研發了北大視頻資源庫。
北大視頻資源庫的功能模塊包括:用戶管理,院系管理,課程管理,視頻管理,每個模塊都開發了增、刪、改、查功能[1]。
1.1用戶管理模塊
管理員有三級:①“最高級管理員”,可以管理所有院系、所有課程、所有課程中的所有視頻,“視頻刪除”功能是真正的刪除。能為所有課程指定相應的“課程管理員”。②“全部課程視頻管理員”,可以管理所有課程中的視頻,“視頻刪除”功能只是打一個標記,并不是真正刪除。③“部分課程視頻管理員”,只能管理部分課程的視頻[2]。
如圖1所示,用戶(User)實體的屬性包括:用戶ID(主鍵),用戶名(唯一約束),真實姓名,密碼,電子郵箱,院系名稱,聯系電話,角色(通過數據字典把管理員分成三個級別),備注,院系編號,創建者的用戶名,創建者用戶ID(外鍵關聯自身實體User),院系ID(外鍵關聯院系實體Department),時間。
1.2院系管理模塊
可管理北大所有的院系。管理員登錄后單擊“院系管理”進入本模塊,如圖2所示。首先得到按照“課程數量”降序排列的院系列表。“課程統計”功能能自動統計出每個院系在系統中的“課程數量”。院系(Department)實體的屬性包括:院系ID,院系編號,院系名稱,課程數量。
1.3課程管理模塊
從圖2“院系管理”的“院系列表”頁面,單擊任意一個院系名稱進入本模塊,如圖3所示。可以管理該院系的所有課程。首先得該院系的課表列表,在新增、刪除某個課程時,會級聯更新“院系管理”模塊中本課程所在院系的“課程數量”字段。在新增課程時,用程序保證“課程id+教師id”不能重復。課程(Course)實體的屬性包括:課程ID(主鍵),課程名稱,教師姓名,教師ID,院系ID(外鍵關聯院系實體Department),院系名稱,北大教學網對應ID,管理員帳號,是否是公開課,一級學科名稱,課程縮略圖地址,本碩標志位,視頻數量,課程訪問量[3]。

圖2 院系管理

圖3 課程管理
1.4視頻管理模塊
在圖3“課程管理”的“課程列表”頁面,單擊任意一個課程名稱進入本模塊,如圖4所示。首先得到該課程的視頻列表。單擊任意一個視頻的“播放按鈕”,可以播放該視頻。
“假刪除”功能:為了防止視頻資源的誤刪除,假刪除功能只是對視頻打個刪除標志,同時把要刪除的文件改名為“_時間戳”,并以新文件名更新數據庫。為避免多次假刪除后,導致文件名很長,從程序上規定一個文件只能被假刪除一次。在假刪除后,還能保證序號像真刪除一樣排列。在圖3中單擊“查詢假刪除視頻”,能查詢出所有課的已經假刪除的視頻。查出的視頻標題命名為“課程名稱_視頻標題”。“視頻管理”模塊的視頻列表是按第幾次課,第幾講排序,因為“查詢假刪除視頻”功能是查詢所有課程的已刪除視頻,就不能再按第幾次課,第幾講排序了,所以程序按照id降序排列,采用的技術為用url傳數組。對于普通用戶假刪除視頻后,該記錄自動隱藏,對于最高級管理員,可以看到已經假刪除的視頻,并且可以實施真正的刪除操作。

圖4 視頻管理
在圖4“視頻管理”頁面,單擊“添加”進行視頻新增操作,如圖5所示。第幾次課和第幾段的智能自動設置:首先查詢數據庫得出下一個是第幾講、第幾段并自動填入。因為一次課把視頻最多分成3段,實現了下列幾種情況。①如果一門課是第一次添加視頻,則默認為第1次課第1段。②如果一門課已經存在n次課的第03段,則新增視頻時,“次數”n加1,“段數”置1,錄制日期置空。③如果一門課已經存在第n次課01段,則新增視頻時,次數n不變,段數加1,錄制日期不變。④單擊“下一次”按鈕時,則“次數”n加1,“段數”置1,錄制日期置空。因為當前瀏覽器都限制從表單input type=file中獲取操作系統文件的真實路徑,我通過編碼突破了這一限制,實現了能從form的input type=file字段取得視頻文件的真實路徑,并支持中文路徑。進而以參數形式將路徑交給applet進行FTP方式上傳。通過代碼優化和FTP服務器的參數配置實現多用戶并發大文件上傳。向大文件上傳控件applet傳遞參數時采用了加密機制,并通過算法優化提高加密和解密速度。允許上傳的文件的格式包括flv、mp4、f4v和m4v,這與flash流媒體服務器支持的類型一致,對其他類型的文件,給出警示對話框的同時給出轉碼工具的鏈接。添加錄制日期時,輸入框可以直接輸入日期,也可以用時間選擇器。對用戶的表單輸入作了前后臺雙重驗證。
在圖5中單擊下一步,啟動JavaApplet,這是基于FTP協議自主研發的大文件視頻上傳控件,如圖6和圖7所示。前臺用戶能以web方式將大于5 G的大視頻文件上傳到指定目錄中,上傳目錄和Flash流媒體服務器的媒體目錄關聯,該上傳控件能提取視頻長度等媒體元數據,能返回供外部系統調用的RTMP流路徑。系統把元數據信息自動存入數據庫中,元數據信息包括院系、課程、第幾講、第幾段、文件路徑、視頻時長等,視頻上傳有進度條。視頻上傳成功后,可按院系、課程、第幾講、第幾段導航視頻資源,并可以播放、編輯和刪除。
如圖8所示,文件的目錄結構和文件命名是根據用戶輸入的元數據自動創建的,程序保證如果元數據信息相同則不允許再次上傳。視頻(Video)實體的屬性包括:視頻ID,視頻標題,第幾次課,第幾段,顯示用的標題(課程名稱-第幾講:視頻標題),視頻地址,視頻縮略圖,是否刪除,是否顯示,是否是申報視頻,視頻訪問量,錄制日期。

圖5 元數據的采集與自動處理

圖6 基于JavaApplet的視頻上傳控件

圖7 支持5G以上的大文件并帶進度條

圖8 由元數據生成文件的目錄結構

圖9 北大視頻資源庫的流程圖

圖10 對Flash流媒體服務器二次開發實現流權限控制
如圖9所示,北大資源庫的視頻資源來自兩方面:①攝像機的直播流通過分布式轉碼自動存入庫中。②后期經過非線性編輯后的教學錄像通過自主研發的多媒體上傳控件從前臺以web方式存入庫中。分布式轉碼采用Apple公司的Podcast Producer進行,實現自動轉碼、添加片頭片尾水印、自動備份管理、自動發布等。北大視頻資源庫和Oracle數據庫、文件服務器協同工作:教學錄像存入文件服務器的同時把文件地址等元數據信息存入Oracle數據庫,并把文件地址與北大視頻資源庫的流媒體目錄關聯起來,并保證各個服務器之間協同工作與權限控制。
為保障Flash流媒體服務器的安全,需要保證只有經過授權的攝像機才能向服務器端發送視頻流,還要保證只有經過授權的第三方系統才能引用流媒體服務器的視頻資源[4]。采用腳本語言對Flash流媒體服務器二次開發實現[5]:①如圖10所示,移動攝像機通過Flash Media Live Encoder向服務器發送直播流時,采用用戶名和密碼的方式進行權限控制,因為移動攝像機的IP地址不固定。②針對固定攝像機的直播流和第三方系統點播流采用黑白名單權限控制。
流權限控制的關鍵技術如下:在Flash流媒體服務器的媒體目錄(/usr/keieproject/adobe/fms/applications)中創建若干個文件夾作為直播頻道,如dianjiao104、dianjiao114等。在每個頻道下面部署如下關鍵文件:allowedHTML、domains.txt、allowed-SWFdomains.txt、Application.xml、main.ase。在文件allowedHTMLdomains.txt和allowedSWFdomains.txt中輸入允許調用本Flash流媒體服務器的第三方系統的服務器IP地址列表,一行輸入一個IP地址。main.ase文件是由main.asc編譯得到的。main.asc關鍵代碼如下:

4.1JavaApplet多媒體上傳控件在jsp頁面中的調用方法與接口參數
4.1.1jsp頁面中applet回調的js函數
function myFunction(text) {document.forms[0]. accessory.value =text; document.forms[0].submit(); }該函數通過參數text能接受applet傳回的成功上傳的文件地址,并將該地址存入jsp頁面中名為accessory的表單域,并觸發表單提交事件
4.1.2applet嵌入jsp頁面的方法和接收的參數
4.1.3參數說明
param_host,param_user, param_pass分別為ftp服務器的主機地址、用戶名、密碼;這3個參數在jsp頁面傳入applet之前按自定義算法加密,在applet中對接收的參數值再按相應的算法解密。param_allowFileType:允許上傳的文件類型;param_path:文件要存儲的相對于ftp帳戶根目錄的路徑;param_saveAsFileName:文件將另存的文件名;param_postscript:文件上傳成功后回調的jsp頁面中的js函數。
4.2Zupload.java實現的關鍵技術
4.2.1父類及實現的接口
2018年11月4日,面對新疆隊的比賽,易建聯因傷缺陣,周鵬、威姆斯被禁賽,三巨頭無緣面對新疆第二戰,無勝負之壓力的年輕球員獲得更多出場時間。
包括ConnectionListener和ActionListener。
4.2.2實現ConnectionListener接口中的方法
//程序調用chdir()時觸發。
updateRemoteDirectory(BasicConnection con){}
//當建立ftp連接時調用。
connectionInitialized(BasicConnection con) {connected = true;}
//每成功傳輸bytes的數據就調用。
//更新進度條并重繪窗體
updateProgressBar();repaint();
//當連接失敗時調用
connectionFailed(BasicConnection con, String why)。
//上傳完成一個文件后觸發該事件,如果所有文件alFiles非空,繼續上傳下一個文件,否則調用jsp接口中的js函數。
actionFinished(BasicConnection con){}
4.2.3實現ActionListener接口中的唯一的方法:actionPerformed(ActionEvent e)。
因為本類有該方法,所以在init()方法中可為按鈕Add Files、Remove Files、Upload Files增加事件監聽者.addActionListener(this);這里通過e.getSource()判斷事件源,進而調用相應的代碼塊。如果事件源是bAddFile就通過彈出一個打開文件的文件選擇器對話框,選擇一個文件。如果事件源是bRemov-eFile從將要上傳的所有文件alFiles動態數組中刪除指定位置的文件,并更新需要上傳的所有文件大小。如果事件源是bUpload就調用uploadFiles()將所有的文件一個接一個地上傳。uploadFiles():如果alFiles所有文件為空,就退出該方法,否則創建一個FtpConnection對象con,利用con對象將所有的文件一個接一個地上傳,調用con的方法addConnectionListener(this)增加事件監聽者;login(…)登錄;chdir()切換目錄;mkdir()創建目錄;con.handleUpload(…)進行文件上傳;con.abort()終止文件傳輸;con.disconnect()斷開連接。通過下面的代碼塊實現斷點續傳while(!connected){try {Thread.sleep (10);}catch(Exception ex) { ex.printStackTrace(); }} 4.2.4重載Applet類的下列方法:init(),start(),stop(), destroy()
init():當Applet第一次load的時候調用這個函數,在Applet的生存周期中只調用一次。構造圖7所示的applet界面并增加按鈕的事件監聽者this。用到的組件有文件選擇器JfileChooser、按鈕Jbutton、水平進度條JprogressBar、列表框Jlist、JScrollPane滾動條、抽象窗口工具箱容器Container、布局管理器GridBagLayout、布局管理器的約束GridB-agConstraints。通過getParameter()得到上述jsp頁面中的接口參數,需要解密的參數在這里進行解密。
start():init()初始化之后,緊接著自動調用start()方法。當用戶離開包含Applet的主頁后又再返回時,系統都會自動再執行一遍start()方法,該方法在Applet的生存周期中可能被調用多次。如何jsp頁面中的接口參數非空,就把名為bParamsSet的類成員變量設為true.
stop()和destroy():進行ftp連接資源(con)的銷毀,如果con非空,就執行con.abort(); con.disconnect(); con=null。當瀏覽器離開Java Applet所在的頁面轉到其他頁面時,stop()方法被調用。當用戶關閉瀏覽器時,destroy()方法被調用。
“基于Flash流媒體服務器的北大視頻資源庫”為北大如下七大系統提供RTMP協議的視頻流支持、元數據管理和內容發布:北大公開課、全校大學英語一二三級網絡測試、北大組織部的黨課、北大教學網、北大講座網、北大網絡教育電視臺、北大移動課堂視頻終端。北大視頻資源庫目前有視頻課程114門,教學視頻3364講,與基于Blackboard的北大教學網進行了嵌入式完美無縫對接,與北京大學移動課堂視頻終端無縫對接[5]。
[1] 楊公義. 大學生創新能力培養的網絡平臺設計與開發[J].遠程教育雜志, 2008, (01): 59-62. YANG Gongyi. The Design of Network Platform for Undergr aduate’s Cr eative Talents Cultivation[J]. Distance Education Journal, 2008, (01): 59-62. (in Chinese).
[2] 楊公義, 張亦工. 北京大學教室管理系統的設計與實現[J].現代教育技術, 2015, (4): 115-120. YANG Gongyi, ZHANG Yigong. Design and Implementation of Peking University Classroom Management System[J]. Modern Educational Technology, 2015, (4): 115-120. (in Chinese).
[3] 楊公義. 基于SSH的播客資源平臺的設計與實現[J]. 現代遠程教育研究, 2009, (1): 66-68. YANG Gongyi. A Podcast Resource Platform Basing on SSH[J]. Modern Distance Education Research, 2009, (1): 66-68. (in Chinese).
[4] 楊公義, 張亦工. 基于Red5的網絡教育電視臺的設計與實現[J]. 現代教育技術, 2012. (8): 109-112. YANG Gongyi, ZHANG Yigong. Design and Implementation of Red5-Based Net Education TV Station, 2012. (8): 109-112. (in Chinese).
[5] 陳飛, 楊公義, 李志剛, 等. 基于Blackboard系統的“北大教學網”擴展開發研究[J]. 北京大學教育評論, 2013, (12): 201-211. CHEN Fei, YANG Gongyi, Li Zhigang, et al. Extension and Development of Peking University Academic Online Based on Blackboard System[J], 2013, (12): 201-211. (in Chinese).
Design and Implementation of Peking University Video Resource Library Based on Flash Streaming Media Server
YANG Gong-yi
(Center for Excellent Teaching and Learning, Peking University, Beijing 100871, China)
Video resource library made by independent research and development integrates more easily to the third party system in school. Flash streaming media server has been used to develop the video resource library in Peking University. The function modules include: user management, department management, curriculum management, video management. The live stream of the video camera can be stored in this library. The teaching video after the nonlinear editing can be uploaded to this library in browser through large file upload component which are independent research and development. Streaming permission control ensures that the camera can't send the video stream to the library until it passes through the authorization. Only the authorized third party system can reference the video resources of the streaming media server. For the school's seven major systems this library provides RTMP protocol video stream support, metadata management and content distribution.
Video resource library; Streaming media server; Large file upload component; Streaming permission control
TP315
A
10.3969/j.issn.1003-6970.2016.08.002
中國下一代互聯網示范工程CNGI項目的子項目(CNGI2008-129-116);教育部項目
楊公義(1978-),男,工程師,主要研究方向:基于流媒體的視頻資源庫開發、基于SSH的輕量級J2EE應用開發。