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

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論