1. 程式人生 > >設計並實現支援多種格式的流媒體視訊點播系統

設計並實現支援多種格式的流媒體視訊點播系統

  我之前有篇文章“如何實現一個c/s模式的flv視訊點播系統”介紹過一個C/S模式的Flv點播系統,Flv格式簡單,處理起來也比較輕鬆,不過,實際工作中,需要點播的影片,豈會只有Flv這一種格式。我們常見的幾種視訊格式,隨便哪一個都要比Flv複雜的多,尤其是本身設計的時候就沒有考慮到要通過網路觀看的格式,要實現點播,自然要比Flv難的多。當然,你可以把所有影片都轉成Flv格式來處理,可是,當你擁有成千上萬部影片的時候,不但得一個個轉換,還要一個個檢查是否轉換成功、轉換質量如何等,那工作量可不是一點半點。從這點考慮出發,做一個支援多種視訊格式的點播系統,就顯得很有必要了。

  可是,視訊格式有很多,千差萬別,有的格式裡面,描述視訊資訊的欄位一大堆,而有的格式裡卻幾乎沒什麼描述的欄位,這麼個情況下,怎麼能把它們揉合到一個系統中去呢?本人不才,做了這個嘗試,目前已經支援AVI

TSFLVF4V格式在同一個點播系統中的播放和拖動,而且不存在拖動後花屏的現象。下面我介紹一下這個點播系統的設計方案和架構。

 

一、設計方案

  點播系統,最重要的考慮因素就是“拖動”的處理,關鍵點就是要在客戶端播放器“拖動”進度條的時候,伺服器給客戶端返回以關鍵幀起始的視訊流,否則,播放器很有可能會出現花屏,甚至無法播放的情況。使用者不是神仙,看影片的人才不會去關注一個片子裡哪些時間點是關鍵幀的位置,使用者拖動進度條的位置,是非常隨意的,而視訊並非每一秒都是關鍵幀,所以,播放器必須要把拖動後進度條的位置,重新定位到離它關鍵幀之處(想想看,大家平時看片,都是這種體驗吧)。

  在點播系統中,播放器想要實現上面所說的定位關鍵幀的技術,就要知道影片的關鍵幀列表,可是“點播”嘛,視訊在伺服器上,是邊下邊看的,沒法自己解析,只能讓伺服器告訴它。具體的獲知方式,我覺得,可以設計成以下3種方案,這3中方案,針對AVI, TS, FLV等很多格式,都可以適用:

  1. 每次拖動之後時,先發起一個請求,將拖動位置告訴伺服器,由伺服器返回最近關鍵幀對應的位置,然後播放器再以這個位置發起請求,伺服器返回資料,播放。

    

 

  2. 將方案1的兩個請求合併為1個,伺服器返回關鍵幀位置+資料,播放器播放。

    

 

  3. 在開始點播一個視訊之前,先發起一個請求,伺服器返回所有關鍵幀的位置,拖動時,播放器先定位到關鍵幀位置,然後直接請求資料,播放。

    

  這個系統中,我選擇了方案三,原因就是處理簡單~~

 

二、處理邏輯

  這裡,以f4v檔案為例。(其中,XVideoKFrame是視訊格式解析程式,作用是讀取AVI TS等視訊,並生成關鍵幀列表。)

    

    

 

三、程式架構

1. Client端

  相對比較簡單,當然,原因是我採用了libvlc作為播放器核心,vlc對於播放網路流的支援,恐怕是最好的,這省去了你自己寫播放器的工作。libvlc的介面比較簡單,我就直接上程式碼,大家一看就明白了。

  私有成員變數:

  操作libvlc進行播放的方法:

 

2. Server端

  點播Server端,就是一個比較特殊的HttpServer,“特殊”主要是指在處理拖動的請求上。

    

 

四、視訊格式解析器

   XVideoKFrame,負責讀取並分析輸入的視訊格式,然後Video.kframe檔案,這裡麵包含了關鍵幀列表和其他媒體資訊,是一個非常重要的程式/模組,點播系統的工作基礎。在上面的處理邏輯圖裡面,我把視訊解析這部分放在了單獨的程式當中,主要是方便平時除錯和增加格式解析的程式碼。當然也可以放到Server中,在視訊檔案第一次被訪問時,生成.kframe檔案。

  目前,該解析器已經支援AVI格式解析TS格式解析FLV格式解析F4V格式解析,正在寫ASF格式解析,往後也還會增加。視訊格式解析,是點播系統中工作量最大的部分之一,除了要讀取數不清的欄位,還要針對不同的編碼,做不同的處理。例如TS格式,是不是H264編碼,對於關鍵幀的查詢方法是完全不一樣的。我就不把所有格式的解析方法寫出來了,將來有機會再寫文章介紹這些格式。

    

    

 

五、效果圖 

  最後,讓大家看一下效果圖,這個是點播ts檔案的效果

    

 

  合作請聯絡QQ。(轉載請註明作者和出處)