天天看點

如何實作一個c/s模式的flv視訊點播系統

  視訊點播,是一個曾經很熱,現如今依然很熱的一項視訊服務技術。本人最近緻力于研究将各種視訊格式應用于點播系統中,現已研究成功FLV, F4V, MP4, TS格式的視訊點播解決方案,完全支援以上格式中存放H.264編碼視訊的情況,并将繼續研究其他格式。

  這裡有一點需要說明的是,F4V本來指的是Adobe基于ISO/IEC 14496-12标準推出來的視訊格式,與MP4格式相同,但因為國内許多的視訊網站,均把存放H.264編碼視訊的FLV檔案标注為.f4v格式,而這種檔案的點播實作方式和普通的FLV是有所不同的,是以,為了避免更加混淆,我沿用了它們的命名方式,是以,“FLV”将僅指不包含H.264/AAC編碼的一般FLV視訊。

  本文簡單介紹如何實作一個簡單的基于flv的視訊點播系統。

  FLV(Flash Video)是Adobe公司推出的視訊格式,是一種專門用來在網絡上傳輸的視訊存儲容器格式。其格式相對簡單,不需要很大的媒體頭部資訊,是以加載速度極快。國内各大視訊網站,均有采用FLV格式作為其點播、甚至直播的視訊格式。FLV容器格式的主要特點是tag,整個FLV由Video Tag, Audio Tag以及其他Tag組成,沒有映射表。

  基本上,可以把FLV格式簡要畫為如下形式:

  

如何實作一個c/s模式的flv視訊點播系統

  其中,FLV Header指的是FLV的頭部,隻有9個位元組,和正常的MP4檔案頭部相比,這個小太多了。FLV MetaData存放的是一些整個視訊檔案的媒體資訊,包括作者、視訊寬高、時長、關鍵幀清單等等,這些資訊對于解析視訊檔案來說,當然很重要,不過可惜的是,因為FLV的MetaData是可有可無的,是以有不少FLV沒有MetaData,而且即便有,其MetaData中的資訊也是不正确的,這導緻MetaData非常不值得信賴。是以,在解析FLV的時候,應該直接忽略FLV MetaData部分,通過周遊FLV的所有Tag,來擷取相應的媒體資訊。

  點播系統的實作,有幾個關鍵點,最重要的應該是“播放網絡流”和“拖動”這兩點。其中,關于“拖動”,由于整個系統是基于網絡的,用戶端在拖動之後,必須重新向伺服器端發送請求,伺服器根據用戶端的拖動請求,尋找最接近的拖動點,傳回可以播放的資料流,進而完成點播拖動。

  對于FLV來說,因為其格式簡單,頭部非常小,而MetaData可以不要,是以隻需要尋找到關鍵幀,然後拼上FLV Header,就可以組成一個可播放的視訊檔案。如下圖所示:

如何實作一個c/s模式的flv視訊點播系統

  根據FLV格式的特點,以及拖動後生成新的可播放檔案的方法,可以将flv點播系統設計成如下方案:

如何實作一個c/s模式的flv視訊點播系統

  1. 伺服器端

  首先,解析flv檔案,生成flv視訊關鍵幀清單,表明時間和便宜量的對應關系。然後,當接收到用戶端發來的資料請求時,根據用戶端拖動的時間點的請求,找出時間距離最近的關鍵幀,根據偏移量,讀取flv的檔案資料,然後拼接flv的9位元組檔案頭部(還需要再加上4個位元組全零的pre tag size,共13位元組),傳回。

  2. 用戶端

  用戶端需要特别注意的,除了正确的解析視訊流并播放,還需要小心時間軸的行進,因為使用者拖動的時間位置并不一定是關鍵幀,是以,需要根據伺服器傳回的關鍵幀的真實時間,重新定位播放進度。

  伺服器可以實作為一個http server,隻需要提供http下載下傳,在響應下載下傳之前,需要完成之前所描述的邏輯。可以完全自己實作,可以直接使用現有的成熟web server,如果對性能要求很高,強烈推薦nginx,借助于nginx強大的處理性能,通過實作自己的nginx module,可以完成你所有的需求。

  用戶端播放器,對于不太熟悉播放器開發技術的,可基于libvlc,借助于vlc良好的網絡播放能力,基本可以滿足需要。

下面是前些日子做的一個示範程式,

如何實作一個c/s模式的flv視訊點播系統

------------------------------------------------------------

如何實作一個c/s模式的flv視訊點播系統

轉載請注明作者和出處,謝謝~

繼續閱讀