Stagefright緩存機(jī)制PPT學(xué)習(xí)課件_第1頁
Stagefright緩存機(jī)制PPT學(xué)習(xí)課件_第2頁
Stagefright緩存機(jī)制PPT學(xué)習(xí)課件_第3頁
Stagefright緩存機(jī)制PPT學(xué)習(xí)課件_第4頁
Stagefright緩存機(jī)制PPT學(xué)習(xí)課件_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Stagefright緩沖機(jī)制android2.3.3,一、AndroidBinder機(jī)制,二、SetDataSource過程,三、prepare過程,四、緩沖讀取過程,1,AndroidBinder機(jī)制,Proxy進(jìn)程的MediaPlayer到Native進(jìn)程上的AwesomePlayer,Proxy進(jìn)程,Native進(jìn)程,2,AndroidBinder機(jī)制,Proxy進(jìn)程與Native進(jìn)程上的AwesomePlayer通信setDataSource操作,Proxy進(jìn)程端,獲得BpMediaPlayerService后通過ProxyBinder通信,在data中寫入uri,3,AndroidBinder機(jī)制,獲得與Native進(jìn)程上AwesomePlayer通信的BpMediaPlayerService對象,先要獲取BpMediaPlayerService類型的mediaPlayerService對象,這是工作在Proxy進(jìn)程上的,setDataSource操作通過這個對象與Native進(jìn)程上的BnMediaPlayerService類型對象進(jìn)行通信。事實(shí)上,獲得MediaPlayerService的過程也需要IPC從Native進(jìn)程上獲得,在checkService函數(shù)中有此過程,此處略,4,AndroidBinder機(jī)制,Proxy進(jìn)程與Native進(jìn)程上的AwesomePlayer通信setDataSource操作,Native進(jìn)程端,在Native進(jìn)程端處理數(shù)據(jù)的為MediaPlayerService的對象,5,AndroidBinder機(jī)制,Proxy進(jìn)程與Native進(jìn)程上的AwesomePlayer通信setDataSource操作,Native進(jìn)程端,Native端:setDataSource時先建立處理流媒體對應(yīng)的Player對象,通過Client建立StagefrightPlayer對象,其中包含AwesomePlayer類型的成員屬性mPlayer,6,AndroidBinder機(jī)制,Proxy進(jìn)程與Native進(jìn)程上的AwesomePlayer通信setDataSource操作,Native進(jìn)程端,7,AndroidBinder機(jī)制,Proxy進(jìn)程與Native進(jìn)程上的AwesomePlayer通信prepare,start,stop等操作,Proxy進(jìn)程上通過IPC發(fā)送處理的請求,8,AndroidBinder機(jī)制,Proxy進(jìn)程與Native進(jìn)程上的AwesomePlayer通信prepare,start,stop等操作,Native進(jìn)程端處理相應(yīng)的請求并通過Client-StagefrightPlayer-AwesomePlayer執(zhí)行最終的操作,大致過程同上,9,SetDataSource過程,傳入的只是一個URL和在構(gòu)成Request時需要的HTTPHeader只在局部變量中保存即可reset_l只是一個復(fù)位局部變量的函數(shù),10,prepare過程,AwesomePlayer內(nèi)部mQueue(TimedEventQueue)是一個事件隊(duì)列mQueue單獨(dú)有自己的線程(pthread)隨時監(jiān)視隊(duì)列是否為空通過異步的方式處理從Proxy進(jìn)程傳入Native進(jìn)程上的事件通過onPrepareAsyncEvent方法來響應(yīng)prepare事件,11,prepare過程TimedEventQueue的一點(diǎn)說明,TimedEventQueue在插入隊(duì)列時是按照事件等待響應(yīng)時間排序插入的等待時間越長的會越往后插入隊(duì)列,三個方法分別加入隊(duì)列頭,尾和按等待時間,3.Fire觸發(fā)事件-AwesomeEvent,12,prepare過程onPrepareAsyncEvent處理prepare事件,根據(jù)mUri的信息設(shè)置并綁定好對應(yīng)的音視頻源初始化視頻,音頻解碼器發(fā)送繼續(xù)緩沖事件檢查是否需要繼續(xù)緩沖數(shù)據(jù),13,prepare過程onPrepareAsyncEvent處理finishSetDataSource,14,檢查setDataSource時保存的mUri屬性前幾個字符如果是以httplive:/開頭則開始httplivestreaming的處理,3.當(dāng)真正開始與服務(wù)器進(jìn)行連接時需要把頭改成http:/才行建立LiveSource對象,此時就與服務(wù)器第一次連接,并得到.m3u8文件根據(jù)LiveSource對象建立視頻的數(shù)據(jù)緩沖對象NuCachedSource2根據(jù)緩沖得到的數(shù)據(jù)進(jìn)行分析并開始分離音視頻,prepare過程onPrepareAsyncEvent處理finishSetDataSource,15,prepare過程建立liveSource對象,16,prepare過程建立liveSource對象,fetchM3U與服務(wù)器連接,首先需要根據(jù)傳入的host/port連接服務(wù)器與服務(wù)器連接后發(fā)送Request請求,17,prepare過程建立liveSource對象,fetchM3U與服務(wù)器連接,18,prepare過程建立liveSource對象,fetchM3U向服務(wù)器發(fā)送請求,在NuHTTPDataSource的connect中,通過HTTPStream屬性connect服務(wù)器成功后發(fā)送Request,19,prepare過程建立liveSource對象,fetchM3U向服務(wù)器發(fā)送請求,把mOffset屬性更新成用戶新定義的傳入的offset,然后在Request的Range域中寫好新的offset值發(fā)送給服務(wù)器這樣以后從服務(wù)器讀到的流數(shù)據(jù)就是用戶調(diào)整播放時間后需要的數(shù)據(jù)了,這個Request是在服務(wù)器端進(jìn)行相應(yīng)的調(diào)整Range域的含義:bytes=a-b表示需要從服務(wù)器下載從第a字節(jié)到第b字節(jié)的數(shù)據(jù),如果寫成bytes=a-則表示從第a字節(jié)到結(jié)束在發(fā)送數(shù)據(jù)的if語句中通過|或的方式也順帶進(jìn)行了mHTTP.receive_header接收服務(wù)器發(fā)回的Response相應(yīng)完成一次握,20,prepare過程建立liveSource對象,fetchM3U處理接收響應(yīng),21,prepare過程建立liveSource對象,fetchM3U處理接收響應(yīng),22,prepare過程建立liveSource對象,fetchM3U處理接收響應(yīng),無論是否使用Range屬性都在此處獲得整個流媒體文件的大小可以通過getSize()獲取到,23,prepare過程建立liveSource對象,24,prepare過程建立liveSource對象,fetchM3U讀取數(shù)據(jù)readAt,只有當(dāng)用戶進(jìn)行了跳進(jìn),即傳入的offset與內(nèi)部記錄的播放mOffset不一致時才從新嘗試連接服務(wù)器,這樣可以在Range域中調(diào)整,讓服務(wù)器能夠傳來跳進(jìn)后的新offset的數(shù)據(jù),如果是連續(xù)播放則不必再連接服務(wù)器,此時讀取的就是index.m3u8文件,把文件內(nèi)容都緩存到之間新new出來的ABuffer對象中,25,prepare過程建立liveSource對象,fetchM3U讀取.m3u8數(shù)據(jù),下載index.m3u8的過程應(yīng)該是一個原子過程,需要盡量能夠得到完整的文件,而且HTTPStream對象在connect服務(wù)器后也把socket設(shè)置成阻塞類型,26,prepare過程建立liveSource對象,fetchM3U返回結(jié)果,fetchM3U把index.m3u8文件緩沖到buffer對象上后就直接把指針給了out參數(shù),接之前l(fā)oadPlayList的序列圖,在完成fetchM3U之后構(gòu)建M3UParser對.m3u8文件進(jìn)行解析,27,prepare過程建立liveSource對象,解析m3u8文件,第一行必須是標(biāo)準(zhǔn)m3u8行頭:,mMeta類型為AMessage,內(nèi)部的Item就是K/Vtuple,其中Item的u部分是聯(lián)合體,通過mType決定如何具體解讀u,獲取每個分片的播放長度,以秒計算并保存到mMeta中,例如15秒一個分片,28,prepare過程建立liveSource對象,解析m3u8文件,如果媒體分片很多.ts文件的索引可能包含在不同的.m3u8文件中按照sequence_number來順序訪問所有的.m3u8文件從而順序索引到所有的.ts文件,行末,完成解析,并設(shè)置標(biāo)記位退出while循環(huán),29,prepare過程建立liveSource對象,解析m3u8文件,具體分片信息,分片時長Key=“duration”,指向下一個URI流的信息稍后說明,30,prepare過程建立liveSource對象,解析m3u8文件,這是可變帶寬的.m3u8文件,此時設(shè)置mIsVariantPlaylist屬性為true,這樣其他所有對該m3u8文件中,非#EXT-X-STREAM-INF行的檢測都略過,需要繼續(xù)進(jìn)行連接,獲得非mIsVariantPlaylist的播放列表為止,例如:,31,prepare過程建立liveSource對象,解析m3u8文件,處理variantPlayList的大致過程:,1.如果#行是可變播放列表則剩下對#行的檢查只檢查#EXT-X-STREAM-INF行在parseStreamInf中獲取這個stream的帶寬值并保存到itemMeta中K/V=“bandwidth”,value,下面是parseStreamInf中關(guān)鍵位置的處理,32,prepare過程建立liveSource對象,解析m3u8文件,處理variantPlayList的大致過程:,2.讀取下一行URI具體內(nèi)容并根據(jù)之前獲得此.m3u8的URI一起拼接成新的URI這個新的URI對應(yīng)之前的帶寬值,MakeURL判斷BaseURI是否為絕對路徑以http:/開頭,不是則在最后一個/后加上line的內(nèi)容,M3UParser.mItems保存著#行中需要繼續(xù)構(gòu)造URI獲取數(shù)據(jù)的項(xiàng)目包括獲取不同帶寬的.m3u8文件的URI即#EXT-X-STREAM-INF(key=“bandwidth”)還有獲取具體編碼數(shù)據(jù).ts文件的URI即#EXTINF(“key=duration”)在完成m3u8的parse后要檢查mItems繼續(xù)嘗試連接服務(wù)器獲取數(shù)據(jù),M3UParser.mMeta保存著#行中不需要再繼續(xù)構(gòu)造URI的項(xiàng)目包括#EXT-X-TARGETDURATION就是一個固定值,33,prepare過程建立liveSource對象,解析m3u8文件,處理variantPlayList的大致過程:,3.讀取完.m3u8文件直到#EXT-X-ENDLIST保存所有#EXT-X-STREAM-INF的bandwidth屬性并拼接保存住對應(yīng)的URI,4.完成m3u8的parse過程回到LiveSource.loadPlayList檢查m3u8是否為variantPlayList類型的播放列表如果是則遍歷獲得所有的帶寬值,都保存到mBandwidthItems:Vector中按照升序排列,34,prepare過程建立liveSource對象,解析m3u8文件,處理variantPlayList的大致過程:,5.嘗試用最高帶寬播放媒體,而最低帶寬只要始終處于available狀態(tài)即可,6.根據(jù)新的URI再次連接服務(wù)器獲取.m3u8文件,如果這次還是variantPlayList就是錯誤的返回false正常情況,此時就獲得了媒體分片索引的.m3u8文件了,內(nèi)部都是.ts分片的uri,35,prepare過程onPrepareAsyncEvent處理finishSetDataSource,36,prepare過程建立NuCachedSource2對象,在NuCachedSource2內(nèi)部也有自己的Looper,也是一個事件隊(duì)列監(jiān)視線程整個從服務(wù)器上fetch數(shù)據(jù)到緩存的過程就是通過post事件來驅(qū)動的NuCachedSource2:onMessageReceived(constsp&msg)處理具體的消息kWhatFetchMore用于緩沖數(shù)據(jù),并保存到PageCache上,37,prepare過程建立NuCachedSource2對象,在NuCachedSource2類內(nèi)與緩沖Cache有關(guān)的幾個屬性和類,38,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),整個android源碼普遍使用sp智能指針,mTarget就是指向NuCachedSource2構(gòu)造函數(shù)里this指針,39,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),gLooperRoster中維護(hù)著很多系統(tǒng)中類似的事件監(jiān)視線程,構(gòu)造AMessage對象時有mReflector-id用于區(qū)分找到目標(biāo)Looper,從而可以post到目標(biāo)Looper上,40,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),41,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),42,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),43,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),向事件隊(duì)列插入消息時要檢查插入的是否是隊(duì)列中的第一個消息因?yàn)樵诒O(jiān)視線程中,如果判斷當(dāng)前隊(duì)列為空則進(jìn)入等待狀態(tài)所以此處如果是第一個消息則發(fā)送信號量觸發(fā)監(jiān)視線程繼續(xù)運(yùn)行,44,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),說明:如果隊(duì)列頭是加了等待鎖的事件(3.),可能的一種情況就是緩沖區(qū)內(nèi)數(shù)據(jù)跟不上播放,此時需要等待緩沖,而緩沖的fetchMore事件也是在這個監(jiān)視線程上工作的,但是fetchMore事件等待時間為0,所以在插入fetchMore事件時會排到隊(duì)列頭,從而先響應(yīng)fetchMore事件,這樣就在達(dá)到等待時繼續(xù)緩沖數(shù)據(jù)的目的,當(dāng)?shù)却i到時開始被響應(yīng)時,緩沖區(qū)內(nèi)也有一定數(shù)據(jù)可讀了,45,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),46,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),整個HTTPLiveStreaming從服務(wù)器緩沖數(shù)據(jù)的過程大致如下:1.與服務(wù)器建立連接后獲得媒體文件的大小,此時offset為02.與服務(wù)器通信的socket是阻塞類型如果無法recv到數(shù)據(jù)30秒后會收到系統(tǒng)INTER中斷信號跳出recv函數(shù)繼續(xù)事件監(jiān)聽線程函數(shù)的執(zhí)行3.在客戶端有一個事件監(jiān)聽線程始終在后臺工作只要PageCache內(nèi)緩沖的數(shù)據(jù)量沒有達(dá)到上限5M就會嘗試從服務(wù)器端獲取數(shù)據(jù)4.接受的數(shù)據(jù)按照64k一頁的方式按照順序存儲到PageCache中這樣通過offset能夠在PageCache中Seek需要的數(shù)據(jù)5.如果緩沖區(qū)到達(dá)緩沖上限,則fetchMore事件將被拖后執(zhí)行,排在隊(duì)列尾一段時間后,如果等待時間delayUs到達(dá),才再繼續(xù)從服務(wù)器獲取數(shù)據(jù)6.當(dāng)用戶需要的數(shù)據(jù)塊offset,offset+size不在緩沖區(qū)上時則會重新刷新緩沖區(qū),此時就會繼續(xù)緩沖新數(shù)據(jù),47,從NuCachedSource2的緩沖中讀取數(shù)據(jù),緩沖命中的情況,readAt中的參數(shù)void*data是上層解碼器的解碼緩存,此處還是用memcpy的方式返回數(shù)據(jù)給上層,沒有使用直接傳指針可能是考慮到

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論