Android視頻直播概要

視頻直播大體框架如上圖

1.直播整體流程:

直播的整體流程如下:錄制->編碼->網(wǎng)絡(luò)傳輸->解碼->播放。根據(jù)該流程分為以下技術(shù)點:

怎樣錄制直播視頻

怎樣實時上傳直播視頻

怎樣播放直播視頻

直播間的用戶是如何交互

2.視頻直播協(xié)議:

????????2.1精簡一對多業(yè)務(wù)模型:


????? ? 2.2各直播協(xié)議的對比:


RTMP--->(Real Time Messaging Protocol)是 Macromedia 開發(fā)的一套視頻直播協(xié)議,現(xiàn)在屬于 Adobe。

使用RTMP技術(shù)的流媒體系統(tǒng)有一個非常明顯的特點:使用 Flash Player 作為播放器客戶端,而Flash Player 現(xiàn)在已經(jīng)安裝在了全世界將近99%的PC上,因此一般情況下收看RTMP流媒體系統(tǒng)的視音頻是不需要安裝插件的。用戶只需要打開網(wǎng)頁,就可以直接收看流媒體。和 HLS 一樣都可以應(yīng)用于視頻直播,區(qū)別是 RTMP 基于 flash 無法在 iOS 的瀏覽器里播放,但是實時性比 HLS 要好。所以一般使用這種協(xié)議來上傳視頻流,也就是視頻流推送到服務(wù)器。

HLS--->是一個由蘋果公司提出的基于HTTP的流媒體網(wǎng)絡(luò)傳輸協(xié)議。

HLS協(xié)議在服務(wù)器端將直播數(shù)據(jù)流存儲為連續(xù)的、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載并播放這些小文件,因為服務(wù)器端總是會將最新的直播數(shù)據(jù)生成新的小文件,這樣客戶端只要不停的按順序播放從服務(wù)器獲取到的文件,就實現(xiàn)了直播。每一個 .m3u8 文件,分別對應(yīng)若干個 ts 文件,這些 ts 文件才是真正存放視頻的數(shù)據(jù),m3u8 文件只是存放了一些 ts 文件的配置信息和相關(guān)路徑,當(dāng)視頻播放時,.m3u8 是動態(tài)改變的,video 標(biāo)簽會解析這個文件,并找到對應(yīng)的 ts 文件來播放。

簡單歸納:首先將一個完整視頻分成多個TS視頻文件,用戶下載m3u8文件,通過m3u8文件的索引地址 ?來播放具體的每個小段視頻。

HLS的請求播放過程:

????????1.HTTP 請求 m3u8 的 url。

????????2.服務(wù)端返回一個 m3u8 的播放列表,這個播放列表是實時更新的,一般一次給出5段數(shù)據(jù)的 url。

????????3.客戶端解析 m3u8 的播放列表,再按序請求每一段的 url,獲取 ts 數(shù)據(jù)流。

HLS的缺點是直播時延時較大,優(yōu)點是:

????????1.傳播性好,利于分享等操作。

????????2.可以動態(tài)發(fā)布,有利于實時迭代產(chǎn)品需求并迅速上線。

????????3.不用安裝 App,直接打開瀏覽器即可。

HTTP-FLV即使用HTTP協(xié)議來流式的傳輸媒體內(nèi)容,直接向后臺上傳編碼后的流媒體數(shù)據(jù)。相對于RTMP,HTTP更簡單和廣為人知,而且不擔(dān)心被Adobe的專利綁架。內(nèi)容延遲同樣可以做到2~5秒,打開速度更快,因為HTTP本身沒有復(fù)雜的狀態(tài)交互。所以從延遲角度來看,HTTP-FLV要優(yōu)于RTMP。

3.播放直播視頻(ijkPlayer):

我自己使用的是一款名為ijkPlayer的三方庫,該庫由b站開源,它是一款基于FFmpeg的輕量級Android/iOS視頻播放庫。

FFmpeg的是全球領(lǐng)先的多媒體框架,能夠解碼,編碼, 轉(zhuǎn)碼,壓縮,復(fù)用,播放大部分的視頻格式。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec。視頻播放也可以基于Vitamio庫,但是對于非個人移動應(yīng)用均需購買Vitamio使用授權(quán)。而這款ijkPlayer則不需要商業(yè)授權(quán)。

? ? ?????3.1:ijkplayer基于 ffmpeg 的跨平臺播放器,實現(xiàn)的特性有:

????????移除 FFmpeg 中不常用的特性以減小體積。

????????對一些在線視頻播放的 BUG 修復(fù)

????????支持安卓 API 9-22 和 iOS 5.1.1-8.3.X

????????使用各種平臺原生的渲染方式進(jìn)行優(yōu)化

????????ijkplayer 實現(xiàn)了跨平臺功能,支持 Android 和 iOS 雙平臺;API 易于集成;編譯配置可裁剪,方便控制安裝包大??;支持 硬件加速解碼,更加省電。

4.引入ijkplayer(兩種方式):

? ???????4.1---在gradle中引入:

????????

這種方案引入比較簡單快捷,缺點是ijkPlayer的某些特點無法完全發(fā)揮,可能無法滿足某些特定的較偏的業(yè)務(wù)邏輯。

????????4.2---編譯源碼得到

????????以Ubuntu為例,Ubuntu需要配置JDK、Android SDK、Android NDK,然后再安裝Git, yasm等工具,具體可以參考這篇文章

最后要提到的一點就是,github上面的官方demo下載下來直接運行的話會報錯:


因為沒有完成源碼編譯形成的so庫,這里采用的方式是:直接通過在Gradle中引入aar庫(aar庫會包含對應(yīng)的so庫等文件)來運行Demo。

在Ubuntu、Mac或Linux其他發(fā)行版等系統(tǒng)下編譯源碼得到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容