我之前有篇文章介紹過(guò)如果實(shí)現(xiàn)一個(gè)C/S模式的Flv點(diǎn)播系統(tǒng),F(xiàn)lv格式簡(jiǎn)單,處理起來(lái)也比較輕松,不過(guò),實(shí)際工作中,需要點(diǎn)播的影片,豈會(huì)只有Flv這一種格式。我們常見(jiàn)的幾種視頻格式,隨便哪一個(gè)都要比Flv復(fù)雜的多,尤其是本身設(shè)計(jì)的時(shí)候就沒(méi)有考慮到要通過(guò)網(wǎng)絡(luò)觀(guān)看的格式,要實(shí)現(xiàn)點(diǎn)播,自然要比Flv難的多。當(dāng)然,你可以把所有影片都轉(zhuǎn)成Flv格式來(lái)處理,可是,當(dāng)你擁有成千上萬(wàn)部影片的時(shí)候,不但得一個(gè)個(gè)轉(zhuǎn)換,還要一個(gè)個(gè)檢查是否轉(zhuǎn)換成功、轉(zhuǎn)換質(zhì)量如何等,那工作量可不是一點(diǎn)半點(diǎn)。從這點(diǎn)考慮出發(fā),做一個(gè)支持多種視頻格式的點(diǎn)播系統(tǒng),就顯得很有必要了。
可是,視頻格式有很多,千差萬(wàn)別,有的格式里面,描述視頻信息的字段一大堆,而有的格式里卻幾乎沒(méi)什么描述的字段,這么個(gè)情況下,怎么能把它們?nèi)嗪系揭粋€(gè)系統(tǒng)中去呢?本人不才,做了這個(gè)嘗試,目前已經(jīng)支持AVI、TS、FLV、F4V格式在同一個(gè)點(diǎn)播系統(tǒng)中的播放和拖動(dòng),而且不存在拖動(dòng)后花屏的現(xiàn)象。下面我介紹一下這個(gè)點(diǎn)播系統(tǒng)的設(shè)計(jì)方案和架構(gòu)。
點(diǎn)播系統(tǒng),最重要的考慮因素就是“拖動(dòng)”的處理,關(guān)鍵點(diǎn)就是要在客戶(hù)端播放器“拖動(dòng)”進(jìn)度條的時(shí)候,服務(wù)器給客戶(hù)端返回以關(guān)鍵幀起始的視頻流,否則,播放器很有可能會(huì)出現(xiàn)花屏,甚至無(wú)法播放的情況。用戶(hù)不是神仙,看影片的人才不會(huì)去關(guān)注一個(gè)片子里哪些時(shí)間點(diǎn)是關(guān)鍵幀的位置,用戶(hù)拖動(dòng)進(jìn)度條的位置,是非常隨意的,而視頻并非每一秒都是關(guān)鍵幀,所以,播放器必須要把拖動(dòng)后進(jìn)度條的位置,重新定位到離它關(guān)鍵幀之處(想想看,大家平時(shí)看片,都是這種體驗(yàn)吧)。
在點(diǎn)播系統(tǒng)中,播放器想要實(shí)現(xiàn)上面所說(shuō)的定位關(guān)鍵幀的技術(shù),就要知道影片的關(guān)鍵幀列表,可是“點(diǎn)播”嘛,視頻在服務(wù)器上,是邊下邊看的,沒(méi)法自己解析,只能讓服務(wù)器告訴它。具體的獲知方式,我覺(jué)得,可以設(shè)計(jì)成以下3種方案,這3中方案,針對(duì)AVI, TS, FLV等很多格式,都可以適用:
1. 每次拖動(dòng)之后時(shí),先發(fā)起一個(gè)請(qǐng)求,將拖動(dòng)位置告訴服務(wù)器,由服務(wù)器返回最近關(guān)鍵幀對(duì)應(yīng)的位置,然后播放器再以這個(gè)位置發(fā)起請(qǐng)求,服務(wù)器返回?cái)?shù)據(jù),播放。
2. 將方案1的兩個(gè)請(qǐng)求合并為1個(gè),服務(wù)器返回關(guān)鍵幀位置+數(shù)據(jù),播放器播放。
3. 在開(kāi)始點(diǎn)播一個(gè)視頻之前,先發(fā)起一個(gè)請(qǐng)求,服務(wù)器返回所有關(guān)鍵幀的位置,拖動(dòng)時(shí),播放器先定位到關(guān)鍵幀位置,然后直接請(qǐng)求數(shù)據(jù),播放。
這個(gè)系統(tǒng)中,我選擇了方案三,原因就是處理簡(jiǎn)單~~
這里,以f4v文件為例。(其中,XVideoKFrame是視頻格式解析程序,作用是讀取AVI TS等視頻,并生成關(guān)鍵幀列表。)
1. Client端
相對(duì)比較簡(jiǎn)單,當(dāng)然,原因是我采用了libvlc作為播放器內(nèi)核,vlc對(duì)于播放網(wǎng)絡(luò)流的支持,恐怕是最好的,這省去了你自己寫(xiě)播放器的工作。libvlc的接口比較簡(jiǎn)單,我就直接上代碼,大家一看就明白了。
私有成員變量:
操作libvlc進(jìn)行播放的方法:
2. Server端
點(diǎn)播Server端,就是一個(gè)比較特殊的HttpServer,“特殊”主要是指在處理拖動(dòng)的請(qǐng)求上。
XVideoKFrame,負(fù)責(zé)讀取并分析輸入的視頻格式,然后Video.kframe文件,這里面包含了關(guān)鍵幀列表和其他媒體信息,是一個(gè)非常重要的程序/模塊,點(diǎn)播系統(tǒng)的工作基礎(chǔ)。在上面的處理邏輯圖里面,我把視頻解析這部分放在了單獨(dú)的程序當(dāng)中,主要是方便平時(shí)調(diào)試和增加格式解析的代碼。當(dāng)然也可以放到Server中,在視頻文件第一次被訪(fǎng)問(wèn)時(shí),生成.kframe文件。
目前,該解析器已經(jīng)支持AVI格式解析、TS格式解析、FLV格式解析和F4V格式解析,正在寫(xiě)ASF格式解析,往后也還會(huì)增加。視頻格式解析,是點(diǎn)播系統(tǒng)中工作量最大的部分之一,除了要讀取數(shù)不清的字段,還要針對(duì)不同的編碼,做不同的處理。例如TS格式,是不是H264編碼,對(duì)于關(guān)鍵幀的查找方法是完全不一樣的。我就不把所有格式的解析方法寫(xiě)出來(lái)了,將來(lái)有機(jī)會(huì)再寫(xiě)文章介紹這些格式。
最后,讓大家看一下效果圖,這個(gè)是點(diǎn)播ts文件的效果
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++
聯(lián)系客服