Android視訊開發進階(part5-ExoPlayer分析1,ExoPlayer的handler)
最近公司的活一直很多時間也很緊,加上忙搬家所以好久沒有更新了。。。今晚剛剛好專案做得差不多,忙裡偷閒更新一下
之前一直說要做一次ExoPlayer(這裡會用ExoPlayer2作為例子)的原始碼分析,想了一下,還是先介紹一下ExoPlayer的程式碼結構比較合適,原因有以下幾點,也算是最近的一些感悟和大家分享:
- 1.其實很多文章,關於框架的原始碼分析都太過深入,其實本質就變成了一次程式碼跟蹤,這樣不是不好,畢竟看程式碼也是能力的一種。但是更多的情況下我們看程式碼,尤其是一些優秀的第三方框架,我們不是希望把程式碼100%背下來,而是學習第三方框架原始碼的優秀之處,看過一次原始碼,要至少明白他的優點在哪,精髓在哪。比如看完Retrofit,我們體會到了這個框架的怎麼進行解耦,怎麼運用註解,看完Volley,我們明白了一個短小精悍的網路庫怎麼做多執行緒,怎麼運用Cache,怎麼進行request的分發等等等等。所以我自己的感覺是需要更多的從整體去理解框架會更有幫助一些。
- 2.很多朋友在學習的時候都太著急,一個框架還沒用熟就老是急著想做“原始碼分析”。我個人的觀點先擺出來,學習一個框架的原始碼,一定要帶著問題去看,不能盲目的進行程式碼跟蹤,那樣一點意義都沒有。要帶著問題,從深度再慢慢擴充套件到廣度,這樣循序漸進的過程才比較科學。有心的朋友可以試著去谷歌上搜尋RxJava source code anaylysis和RxJava原始碼分析,你可以發現,英文的RxJava原始碼分析幾乎沒人做,而中文的文章卻一大堆。仔細想想,這個原因到底是什麼?其實就是國內的應用使用者太多,我們國內的開發者需要對第三方庫(俗稱輪子)做各種各樣的定製(customisation),那麼就免不了對框架進行原始碼的解析。而國外的應用使用者量級與國內壓根沒法比,沒有各式各樣“苛刻”的使用者要求,自然沒有人去做什麼原始碼分析。還是那個觀點,需要帶著問題去看框架,如果沒問題,給自己找一個問題。
所以在開始一次原始碼的結構分析之前,大家先問問自己,我使用過這個ExoPlayer沒有?使用的深度如何?是否只是按照doc做了一個sample,doc上面初始化ExoPlayer的引數和各種構件都代表什麼意思?對ExoPlayer的使用上有沒有什麼疑惑?
說了這麼多廢話,希望也不要打擊大家看原始碼的熱情,只不過學的勤,不如學的巧,掌握更科學的方法可以事半功倍,那何樂而不為。學習這件事本身也是需要耐得住性子。。。so。。。
不要緊張,我們們來段freestyle壓壓驚,開始分析了!
首先ExoPlayer的入口自然是ExoPlayerImplInternal了,在建立ExoPlayer物件之後,ExoPlayer會通過handler,根據當前自身的狀態去不停發放訊息,然後自己同時接受這些訊息。
比如當我們呼叫ExoPlayer的prepare()方法時,其實我們就用ExoPlayer的handler去傳送了一條訊息MSG_PREPARE。
傳送之後,ExoPlayerImplInternal物件自己又接受它,再去處理這條訊息。
最後再叫ExoPlayer所有的MediaSource進行準備prepare。
又或者再看看MSG_DO_SOME_WORK這個訊息發放出去之後,ExoPlayer做了什麼
大家知道在建立ExoPlayer的時候我們需要傳入一個renderer陣列,包括Video,Audio或者字幕的TextRenderer,他們每個都負責渲染Render自己負責的那一部分,在ExoPlayer裡面就是這麼一個簡單的for迴圈,搞定。
在一個dosomeWork()結束之後,通過handler再發一次MSG_DO_SOME_WORK
大家可以自己觀察一下其他MSG是用來幹嘛的,其實稍微看看就可以發現,都是和Playback相關的一些操作,比如seek,pause,release等等。
那麼其實到現在為止,ExoPlayer從整體上是怎麼工作,它的大概結構就很清楚了,用一個圖來表達一下。
user在建立ExoPlayer之後,呼叫任何的方法都是傳送一條message給他的handler,根據訊息的不通,ExoPlayer把訊息分發給不同的component,比如prepare就會把訊息分發給MediaResource,do_some_work會把訊息分發給Render,根據當前的進度去渲染視訊,音訊和字幕。在處理完一個訊息之後,會根據當前狀態傳送下一個訊息給ExoPlayerImplInternnal。在一個不停止的情況下,訊息佇列一般都是:
1.MSG_PREPARE
2.MSG_PERIOD_PREPARED
3.MSG_DO_SOME_WORK........不停的do some work...
整個ExoPlayer就是靠Handler來進行狀態維護的,不光只是ExoPlayerImplInternal這個類,其他的很多類比如LoadControl啊等等都是靠Handler來做狀態維護,和訊息發放,尤其是ExoPlayer的事件分放部分,都需要使用者自己傳入一個handler。可能這對初次使用的同學會造成一定的困擾。
不過在理解了ExoPlayer的大概結構之後,相信為何需要這個Handler的原因大家應該都能理解了。
ExoPlayer本身就是利用handler進行事件分發,和自身的狀態控制,任何使用者的操作,在ExoPlayer內部的實現都是會變成一個handler能處理的Message,再根據message的內容,ExoPlayer會讓不同的構件進行相應的操作,再根據操作的結果發下一個訊息。
這次的分析就先到此為止,下次我會開始分析MediaResource部分,也就是我們每次呼叫prepare()方法之後,我們到底在prepare(準備)什麼?
晚安!
相關文章
- Android視訊開發進階(part1-關於視訊的那些術語)Android
- Android視訊開發進階(part3-Android的Media API)AndroidAPI
- Android進階;Handler訊息機制詳解Android
- Android視訊開發進階(part5-安卓的DRM,視訊版權保護)Android安卓
- Android進階:自定義視訊播放器開發(上)Android播放器
- Android進階:自定義視訊播放器開發(下)Android播放器
- Android開發Handler原始碼分析Android原始碼
- Android進階:十、自定義視訊播放器 1Android播放器
- Android視訊開發進階(part2-MP4檔案的解析)Android
- Android進階知識:Handler相關Android
- Android 進階 ———— Handler系列之建立子執行緒HandlerAndroid執行緒
- Android 高階面試-1:Handler 相關Android面試
- Android視訊開發進階(part4-自適應視訊播放技術(Adaptive Streaming))AndroidAPT
- Android開發之HandlerAndroid
- android 短視訊開發,依靠Kotlin和Handler實現倒數計時AndroidKotlin
- 《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念筆記
- Android應用開發進階Android
- 【HenCoder Android 開發進階】自定義 View 1-7:屬性動畫(進階篇)AndroidView動畫
- 【Android 進階】仿抖音系列之列表播放視訊(二)Android
- Rust 程式設計視訊教程(進階)——017_1 訊息傳遞 1Rust程式設計
- Android高階進階之路【四】一文讀懂 Handler 機制Android
- Rust 程式設計視訊教程(進階)——027_1 高階特性Rust程式設計
- HenCoder Android 開發進階: 自定義 View 1-1 繪製基礎AndroidView
- android 非同步通訊機制Handler的分析與運用Android非同步
- HenCoder Android 開發進階:自定義 View 1-3 文字的繪製AndroidView
- [Android進階]Android訊息機制Android
- Rust 程式設計視訊教程(進階)——026_1 高階 trait1Rust程式設計AI
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- Android開發 海康威視 多路視訊播放(同時播放視訊)Android
- Android——Handler原始碼分析Android原始碼
- Rust 程式設計視訊教程(進階)——024_1 所有模式的語法 1Rust程式設計模式
- Android的Handler訊息機制 解析Android
- HenCoder Android 開發進階: 自定義 View 1-2 Paint 詳解AndroidViewAI
- android訊息機制—HandlerAndroid
- Android訊息機制HandlerAndroid
- android短視訊開發,上傳視訊自動新增水印Android
- 短視訊app開發,點選視訊進行全屏播放APP
- 最全的Android開發資源整理--進階必備Android