最近研究模仿戰(zhàn)旗直播的app 桨醋,今天把視頻源弄到了 可以和正常線app一樣看視頻了。
首先介紹一下 HTTP Live Streaming (HLS) 现斋,給現(xiàn)在正常做視頻直播的朋友提供一下參考喜最。
常用的流媒體協(xié)議主要有 HTTP 漸進(jìn)下載和基于 RTSP/RTP 的實(shí)時(shí)流媒體協(xié)議,這二種基本是完全不同的東西庄蹋,目前比較方便又好用的是用 HTTP 漸進(jìn)下載方法瞬内。在這個(gè)中 apple 公司的 HTTP Live Streaming 是這個(gè)方面的代表。它最初是蘋果公司針對(duì)iPhone限书、iPod虫蝶、iTouch和iPad等移動(dòng)設(shè)備而開發(fā)的流.現(xiàn)在見(jiàn)到在桌面也有很多應(yīng)用了,HTML5 是直接支持這個(gè)倦西。
但是HLS協(xié)議的小切片方式會(huì)生成大量的文件能真,存儲(chǔ)或處理這些文件會(huì)造成大量資源浪費(fèi)。如果要實(shí)現(xiàn)數(shù)天的時(shí)移,索引量將會(huì)是個(gè)巨額數(shù)字粉铐,并明顯影響請(qǐng)求速度疼约。因此,HLS協(xié)議對(duì)存儲(chǔ)I/O要求相當(dāng)苛刻蝙泼。對(duì)此程剥,也有公司提出了非常好的解決方案。
新型點(diǎn)播服務(wù)器系統(tǒng)汤踏,獨(dú)創(chuàng)了內(nèi)存緩存數(shù)據(jù)實(shí)時(shí)切片技術(shù)织鲸,顛覆了這種傳統(tǒng)實(shí)現(xiàn)方法,從根本上解決了大量切片的碎片問(wèn)題溪胶,使得單臺(tái)服務(wù)器的切片與打包能力不再是瓶頸搂擦。其基本原理如下:
不將TS切片文件存到磁盤,而是存在內(nèi)存當(dāng)中哗脖,這種技術(shù)使得服務(wù)器的磁盤上面不再會(huì)有“數(shù)以噸計(jì)”的文件碎片盾饮,極大減少了磁盤的I/O次數(shù),延長(zhǎng)了服務(wù)器磁盤的使用壽命懒熙,極大提高了服務(wù)器運(yùn)行的穩(wěn)定性丘损。同時(shí),由于使用這種技術(shù)工扎,使得終端請(qǐng)求數(shù)據(jù)時(shí)直接從服務(wù)器的內(nèi)存中獲取徘钥,極大提高了對(duì)終端數(shù)據(jù)請(qǐng)求的反應(yīng)速度,優(yōu)化了視頻觀看體驗(yàn)肢娘。
根據(jù)以上的了解要實(shí)現(xiàn)HTTP Live Streaming直播呈础,需要研究并實(shí)現(xiàn)以下技術(shù)關(guān)鍵點(diǎn)
采集視頻源和音頻源的數(shù)據(jù)
對(duì)原始數(shù)據(jù)進(jìn)行H264編碼和AAC編碼
視頻和音頻數(shù)據(jù)封裝為MPEG-TS包
HLS分段生成策略及m3u8索引文件
HTTP傳輸協(xié)議
1. 分段策略
HLS的分段策略,基本上推薦是10秒一個(gè)分片橱健,當(dāng)然而钞,具體時(shí)間還要根據(jù)分好后的分片的實(shí)際時(shí)長(zhǎng)做標(biāo)注
通常來(lái)說(shuō),為了緩存等方面的原因拘荡,在索引文件中會(huì)保留最新的三個(gè)分片地址臼节,以類似“滑動(dòng)窗口”的形式,進(jìn)行更新珊皿。
2. m3u8文件簡(jiǎn)介
m3u8网缝,是HTTP Live Streaming直播的索引文件。m3u8基本上可以認(rèn)為就是.m3u格式文件蟋定,區(qū)別在于粉臊,m3u8文件使用UTF-8字符編碼。
客戶端部分
客戶端開始時(shí)回去抓取 索引文件(.m3u8/.m3u)驶兜,其中用URL來(lái)標(biāo)記不同的流扼仲。索引文件可以指定可用媒體文件的位置远寸,解密的密鑰,以及任何可以切換的流屠凶。對(duì)于選中的流驰后,客戶端會(huì)有序的下載每一個(gè)可獲得的文件。每一個(gè)文件都包含流中的連環(huán)碎片阅畴。一旦下載到足夠量的數(shù)據(jù),客戶端會(huì)開始向用戶展示重新裝配好的媒體資源迅耘。
客戶端負(fù)責(zé)抓取任何解密密鑰贱枣,認(rèn)證或者展示一個(gè)用于認(rèn)證的界面,之后再解密需要的文件颤专。
這個(gè)過(guò)程會(huì)一直持續(xù)知道出現(xiàn) 結(jié)束標(biāo)記#EXT-X-ENDLIST纽哥。如果結(jié)束標(biāo)記不出現(xiàn),該索引就是用于持續(xù)廣播的栖秕〈核客戶端會(huì)定期的加載一些新的索引文件〈睾矗客戶端會(huì)從新更新的索引文件中去查找加密密鑰并且將關(guān)聯(lián)的URL加入到請(qǐng)求隊(duì)列中去只壳。
HLS 的使用
使用 HLS 需要使用一些工具,當(dāng)然大部分工具都是服務(wù)器端使用的暑塑,這里簡(jiǎn)單了解一下就行吼句,包括 media stream segmenter, a media file segmenter, a stream validator, an id3 tag generator, a variant playlist generator.這些工具用英文注明是為了當(dāng)你在蘋果開發(fā)中心中尋找時(shí)方便一些。
會(huì)話模式
通常包含 Live 和 VOD (點(diǎn)播)兩種
點(diǎn)播VOD的特點(diǎn)就是可以獲取到一個(gè)靜態(tài)的索引文件事格,其中那個(gè)包含一套完整的資源文件地址惕艳。這種模式允許客戶端訪問(wèn)全部節(jié)目。VOD點(diǎn)播擁有先進(jìn)的下載技術(shù)驹愚,包括加密認(rèn)證技術(shù)和動(dòng)態(tài)切換文件傳輸速率的功能(通常用于不同分辨率視頻之間的切換)远搪。
Live會(huì)話就是實(shí)時(shí)事件的錄制展示。它的索引文件一直處于動(dòng)態(tài)變化的逢捺,你需要不斷的更新索引文件 playlist 然后移除舊的索引文件谁鳍。這種類型通過(guò)向索引文件添加媒體地址可以很容易的轉(zhuǎn)化為VOD類型。在轉(zhuǎn)化時(shí)不要移除原來(lái)舊的源劫瞳,而是通過(guò)添加一個(gè)#ET-X-ENDLIST標(biāo)記來(lái)終止實(shí)時(shí)事件棠耕。轉(zhuǎn)化時(shí)如果你的索引文件中包含EXT-X-PLAYLIST-TYPE標(biāo)簽,你需要將值從EVENT改為VOD柠新。
客戶端可以緩存m3u8
緩存和發(fā)送協(xié)議
HTTPS通常用于發(fā)送密鑰窍荧,同時(shí),他也可以用于平時(shí)的媒體片段和索引文件的傳輸恨憎。但是當(dāng)擴(kuò)展性更重要時(shí)蕊退,這樣做是不推薦的郊楣。HTTPS 請(qǐng)求通常都是繞開 web 服務(wù)緩存,導(dǎo)致所有內(nèi)容請(qǐng)求都是通過(guò)你的服務(wù)進(jìn)行轉(zhuǎn)發(fā)瓤荔,這有悖于分布式網(wǎng)絡(luò)連接系統(tǒng)的目的净蚤。
處于這個(gè)原因,確保你發(fā)送的網(wǎng)絡(luò)內(nèi)容都明白非常重要输硝。當(dāng)處于實(shí)況廣播模式時(shí)索引文件不會(huì)像分片媒體文件一樣長(zhǎng)時(shí)間的被緩存今瀑,他會(huì)動(dòng)態(tài)不停地變化。
流切換
如果你的視頻具備流切換功能点把,這對(duì)于用戶來(lái)說(shuō)是一個(gè)非常棒的體驗(yàn)橘荠,處于不同的帶寬、不同的網(wǎng)速播放不同清晰度的視頻流郎逃,這樣只能的流切換可以保證用戶感覺(jué)到非常流暢的觀影體驗(yàn)哥童,同時(shí)不同的設(shè)備也可以作為選擇的條件,比如視網(wǎng)膜屏可以再網(wǎng)速良好的情況下播放清晰度更高的視頻流褒翰。