開發視頻點播網站時或許會需要連續播放一系列流媒體文件,我的經驗是可以使用SMIL語言動態生成需要的播放列表文件。以下將對這種方法作出說明。我感覺這并不是一個很好的方法,但可作為一種思路供大家參考。
首先我們應該了解一下SMIL語言的結構。SMIL是專用于流媒體服務器的一種語言,它是符合XML語言規范的。以下是一個典型的用于Helix Server的SMIL文件:
113.smi -------------- <smil> <head> <meta name="title" content="連續播放"/> <meta name="author" content="C.C在線視聽娛樂網 - C.C.M.C."/> <meta name="copyright" content="網站所有資源版權歸其原作者所有,請于下載試用后24小時內刪除"/> </head> <body> <par> <ref src="rtsp://192.168.0.100/D/200485627_24.mp3" title="Whos Who"/> </par> <par> <ref src="rtsp://192.168.0.100/D/200485624_22.mp3" title="Two-Lane Blacktop"/> </par> <par> <ref src="rtsp://192.168.0.100/D/200485618_20.mp3" title="The Wonders of You"/> </par> </body> </smil>
<head>內的title是指顯示在RealPlayer播放機播放列表最上部的標題。author是作者,copyright是版本信息,這些信息可以在點擊RealPlayer跑馬燈字幕的時候看到。<par>內的<ref>中,scr指的是流媒體文件的位置,title是指此媒體顯示在播放列表中的名稱。每個<par>定義一個文件,這樣就實現媒體流的連續播放。使用這種辦法還能很方便的向網站中的媒體文件添加廣告或自定義片頭片尾。知道文件結構剩下的就好辦了。不過注意生成smi文件之前先對字符進行過濾,因為XML中有些字符是不能隨意出現的。
代碼例:
其中有幾個自定義函數不多作介紹(GetExtName為獲取文件擴展名)
xRMExtNames="rm,ram,rmvb,mp3,mpeg,mpa" rmPlayList="smil/a.smi"
Sub WritePlayListRM dim strTmpSrc,sql Set fso = CreateObject("Scripting.FileSystemObject") Set tf = fso.CreateTextFile(server.MapPath(rmPlayList) , True) tf.WriteLine("<smil>") tf.WriteLine("<head>") tf.WriteLine("<meta name=" & chr(34) & "title" & chr(34) & " content=" & chr(34) & XMLFilter(strQuery) & chr(34) & "/>") tf.WriteLine("<meta name=" & chr(34) & "author" & chr(34) & " content=" & chr(34) & XMLFilter(xSiteName) & chr(34) & "/>") tf.WriteLine("<meta name=" & chr(34) & "copyright" & chr(34) & " content=" & chr(34) & XMLFilter(xCopyRight) & chr(34) & "/>") tf.WriteLine("</head>") tf.WriteLine("<body>") set rsServer=Server.CreateObject("ADODB.Recordset") do while not rs.eof if instr(xRMExtNames,lcase(GetExtName(rs("fileName"))))>0 then sql="select * from site_servers where UID=" & rs("serverID") rsServer.open sql,conn,1,1 strTmpSrc=rsServer("RMServer") & rs("fileName") tf.WriteLine("<par>") tf.WriteLine("<ref src=" & chr(34) & strTmpSrc & chr(34) & " title=" & chr(34) & XMLFilter(rs("title")) & chr(34) & "/>") tf.WriteLine("</par>") rsServer.close rmNum=rmNum+1 end if rs.movenext loop rs.movefirst tf.WriteLine("</body>") tf.WriteLine("</smil>") tf.Close set tr=nothing set rsServer=nothing End Sub
Function XMLFilter(strInput) XMLFilter=replace(strInput,"<","(") XMLFilter=replace(XMLFilter,">",")") XMLFilter=replace(XMLFilter,chr(34),"") XMLFilter=replace(XMLFilter,"'","") End Function
這就是我的方法,歡迎大家批評指正。
|