




已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Stagefright緩沖機制android2.3.3,一、AndroidBinder機制,二、SetDataSource過程,三、prepare過程,四、緩沖讀取過程,1,AndroidBinder機制,Proxy進程的MediaPlayer到Native進程上的AwesomePlayer,Proxy進程,Native進程,2,AndroidBinder機制,Proxy進程與Native進程上的AwesomePlayer通信setDataSource操作,Proxy進程端,獲得BpMediaPlayerService后通過ProxyBinder通信,在data中寫入uri,3,AndroidBinder機制,獲得與Native進程上AwesomePlayer通信的BpMediaPlayerService對象,先要獲取BpMediaPlayerService類型的mediaPlayerService對象,這是工作在Proxy進程上的,setDataSource操作通過這個對象與Native進程上的BnMediaPlayerService類型對象進行通信。事實上,獲得MediaPlayerService的過程也需要IPC從Native進程上獲得,在checkService函數(shù)中有此過程,此處略,4,AndroidBinder機制,Proxy進程與Native進程上的AwesomePlayer通信setDataSource操作,Native進程端,在Native進程端處理數(shù)據(jù)的為MediaPlayerService的對象,5,AndroidBinder機制,Proxy進程與Native進程上的AwesomePlayer通信setDataSource操作,Native進程端,Native端:setDataSource時先建立處理流媒體對應(yīng)的Player對象,通過Client建立StagefrightPlayer對象,其中包含AwesomePlayer類型的成員屬性mPlayer,6,AndroidBinder機制,Proxy進程與Native進程上的AwesomePlayer通信setDataSource操作,Native進程端,7,AndroidBinder機制,Proxy進程與Native進程上的AwesomePlayer通信prepare,start,stop等操作,Proxy進程上通過IPC發(fā)送處理的請求,8,AndroidBinder機制,Proxy進程與Native進程上的AwesomePlayer通信prepare,start,stop等操作,Native進程端處理相應(yīng)的請求并通過Client-StagefrightPlayer-AwesomePlayer執(zhí)行最終的操作,大致過程同上,9,SetDataSource過程,傳入的只是一個URL和在構(gòu)成Request時需要的HTTPHeader只在局部變量中保存即可reset_l只是一個復(fù)位局部變量的函數(shù),10,prepare過程,AwesomePlayer內(nèi)部mQueue(TimedEventQueue)是一個事件隊列mQueue單獨有自己的線程(pthread)隨時監(jiān)視隊列是否為空通過異步的方式處理從Proxy進程傳入Native進程上的事件通過onPrepareAsyncEvent方法來響應(yīng)prepare事件,11,prepare過程TimedEventQueue的一點說明,TimedEventQueue在插入隊列時是按照事件等待響應(yīng)時間排序插入的等待時間越長的會越往后插入隊列,三個方法分別加入隊列頭,尾和按等待時間,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.當真正開始與服務(wù)器進行連接時需要把頭改成http:/才行建立LiveSource對象,此時就與服務(wù)器第一次連接,并得到.m3u8文件根據(jù)LiveSource對象建立視頻的數(shù)據(jù)緩沖對象NuCachedSource2根據(jù)緩沖得到的數(shù)據(jù)進行分析并開始分離音視頻,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ù)器端進行相應(yīng)的調(diào)整Range域的含義:bytes=a-b表示需要從服務(wù)器下載從第a字節(jié)到第b字節(jié)的數(shù)據(jù),如果寫成bytes=a-則表示從第a字節(jié)到結(jié)束在發(fā)送數(shù)據(jù)的if語句中通過|或的方式也順帶進行了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,只有當用戶進行了跳進,即傳入的offset與內(nèi)部記錄的播放mOffset不一致時才從新嘗試連接服務(wù)器,這樣可以在Range域中調(diào)整,讓服務(wù)器能夠傳來跳進后的新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文件進行解析,27,prepare過程建立liveSource對象,解析m3u8文件,第一行必須是標準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è)置標記位退出while循環(huán),29,prepare過程建立liveSource對象,解析m3u8文件,具體分片信息,分片時長Key=“duration”,指向下一個URI流的信息稍后說明,30,prepare過程建立liveSource對象,解析m3u8文件,這是可變帶寬的.m3u8文件,此時設(shè)置mIsVariantPlaylist屬性為true,這樣其他所有對該m3u8文件中,非#EXT-X-STREAM-INF行的檢測都略過,需要繼續(xù)進行連接,獲得非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ù)的項目包括獲取不同帶寬的.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的項目包括#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,也是一個事件隊列監(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中維護著很多系統(tǒng)中類似的事件監(jiān)視線程,構(gòu)造AMessage對象時有mReflector-id用于區(qū)分找到目標Looper,從而可以post到目標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ù),向事件隊列插入消息時要檢查插入的是否是隊列中的第一個消息因為在監(jiān)視線程中,如果判斷當前隊列為空則進入等待狀態(tài)所以此處如果是第一個消息則發(fā)送信號量觸發(fā)監(jiān)視線程繼續(xù)運行,44,prepare過程建立NuCachedSource2對象,從服務(wù)器緩存數(shù)據(jù),說明:如果隊列頭是加了等待鎖的事件(3.),可能的一種情況就是緩沖區(qū)內(nèi)數(shù)據(jù)跟不上播放,此時需要等待緩沖,而緩沖的fetchMore事件也是在這個監(jiān)視線程上工作的,但是fetchMore事件等待時間為0,所以在插入fetchMore事件時會排到隊列頭,從而先響應(yīng)fetchMore事件,這樣就在達到等待時繼續(xù)緩沖數(shù)據(jù)的目的,當?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ù)量沒有達到上限5M就會嘗試從服務(wù)器端獲取數(shù)據(jù)4.接受的數(shù)據(jù)按照64k一頁的方式按照順序存儲到PageCache中這樣通過offset能夠在PageCache中Seek需要的數(shù)據(jù)5.如果緩沖區(qū)到達緩沖上限,則fetchMore事件將被拖后執(zhí)行,排在隊列尾一段時間后,如果等待時間delayUs到達,才再繼續(xù)從服務(wù)器獲取數(shù)據(jù)6.當用戶需要的數(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《財務(wù)軟件應(yīng)用》課件(共九個項目)
- 預(yù)防兒童腹瀉培訓課件
- 預(yù)防中暑安全課件
- 預(yù)備小學生課件
- 項目部稅務(wù)籌劃課件
- 項目性學習實驗說課課件
- 音樂課件與環(huán)境相關(guān)主題
- 鐵路工程培訓課件模板
- 健康飲食產(chǎn)業(yè)園項目人力資源管理方案(模板)
- 相關(guān)專業(yè)知識:健康教育的基本理論三
- 2024年糧食購銷合同電子版(2篇)
- 齊魯工業(yè)大學2025級上半年期末大學法理學題庫
- 極簡市場營銷
- 潔牙知情同意書
- 礦山救護規(guī)程課件
- 橡膠制品在電力電氣行業(yè)中的應(yīng)用研究
- 《動態(tài)流量平衡閥》課件
- 跨境電商的法規(guī)和政策解讀與分析
- 電子科技大學《移動通信原理》第七章IS95及其增強移
- 國家中小學智慧教育平臺培訓專題講座
- 7個生活中溝通成功案例 3篇
評論
0/150
提交評論