Android Multimedia架構總結(六)C++中MediaPlayer的C/S架構

來源:互聯網
上載者:User

標籤:

轉載請把頭部出處連結和尾部二維碼一起轉載,本文出自:
http://blog.csdn.net/hejjunlin/article/details/52435789

前面幾節中,都是通過java層調用到jni中,jni向下到c++層並未介紹
看下Java層一個方法在c++層 MediaPlayer後續過程
frameworks/av/media/libmedia/MediaPlayer.cpp
找一個我們之前熟悉的setDataResource方法看下C/S模式的過程,亦可參考Android Multimedia架構總結(四)MediaPlayer中從Java層到C++層類別關係及prepare及之後其他過程中的圖,瞭解整體上C/S架構。先看下Agenda:

  • 舉例setDataSource方法在mediaplayer.cpp之後發生了什嗎?
  • Client到底是什嗎?
  • Client及MediaPlayer是什麼一種關係?
  • IMediaPlayer.h,mediaplayer.h,IMediaPlayerClient分別做什嗎?
舉例setDataSource方法在mediaplayer.cpp之後發生了什嗎?

先看下setDataSource方法:

對應看下MediaPlayerService.cpp中createt函數,這裡說下MediaPlayerService.cpp位置,6.0源碼中是在frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp中。如下:

在new Client中,有一個IPCThreadState,這裡介紹下: 在Android中ProcessState是用戶端和服務端公用的部分,作為Binder通訊的基礎,ProcessState是一個singleton類,每個
進程只有一個對象,這個對象負責開啟Binder驅動,建立線程池,讓其進程裡面的所有線程都能通過Binder通訊。
與之相關的是IPCThreadState,每個線程都有一個IPCThreadState執行個體登記在Linux線程的上下文附屬資料中,主要負責
Binder的讀取,寫入和請求處理架構。IPCThreadState在構造的時候擷取進程的ProcessState並記錄在自己的成員變數mProcess中,通過mProcess可以獲得Binder的控制代碼。詳細瞭解ProcessStata及IPCThreadState源碼,可以參考:《Binder中的ProcessState和IPCThreadState分析》,寫的很不錯,IPCThreadState通過IPCThreadState::transact把data,及handle等填充入binder_transaction_data,在兩個處理序間通訊。

Client到底是什嗎?

這裡這個Client到底是什嗎?我們又得追蹤下,在frameworks/av/media/libmediaplayerservice/MediaPlayerService.h如下:



以上代碼沒有省略,是因為確實對我們理解從Java層過來的MediaPlayer相關方法,在這都有對應。如果還記得前面《Android Multimedia架構總結(四)MediaPlayer中從Java層到C++層類別關係及prepare及之後其他過程》文章中那個圖的話,可以從整體上理解這個Client屬於什麼角色及位置。繼承BnMediaPlayer,並包含了IMediaPlayer相關介面。
總結下上面代碼:Client類的繼承關係為:Client->BnMediaPlayer->IMediaPlayer分析上面代碼,可以看出create方法,是構造了一個Client對象,並且將此client對象添加到mediapalyerservice類的全域列表中:mClients,是一個SortedVector,緊接著執行player->setDataSource(url, headers),即Clients::setDataSource,因此在setDataSource中的

語句相當於

即player最終是用Client對象來初始化,可以直接認為player==client
本文出自逆流的魚yuiop:http://blog.csdn.net/hejjunlin/article/details/52435789

Client及MediaPlayer是什麼關係?

這是候問題來了?在C++中,這個Client及MediaPlayer又是什麼一種關係呢?

  • Client是MediaPlayerService內部的一個類,我們從上面代碼已知,因為MediaPlayerService運行在服務端,故Client也是運行在服務端。
  • Client在MediaPlayerService.h中,那接著看下MediaPlayerService中的實現,實現過程中調用過了MediaPlayerService類的一些函數,同樣回到setDataSource


接下來看MediaPlayer中,以下代碼中在frameworks/av/include/media/mediaplayer.h中:


這裡函數和Client中的函數時一一對應的,兩者通過Client的代理類聯絡在了一起。


上面兩個函數,一個是MediaPlayer的setDataSouree,然后里面會調到attachNewPlayer函數,這個函數最終會調用到服務端Client的對應的函數,
本文出自逆流的魚yuiop:http://blog.csdn.net/hejjunlin/article/details/52435789

IMediaPlayer.h,mediaplayer.h,IMediaPlayerClient分別做什嗎?

到這裡,可能有人會想:IMediaPlayer.h,及mediaplayer.h的區別是什嗎?總結主要如下(另加一個IMediaPlayerClient.h,一起介紹):

  • 從包結構:首先IMediaPlayer和IMediaPlayerClient.h都是在frameworks/av/media/libmedia包下,而mediaplayer.h是在/av/include/media包下。(前面已有代碼貼出)
  • 從功能上看:它們擔當職責也不一樣

這裡貼出IMediaPlayer.h及IMediaPlayerClient.h代碼:
IMediaPlayer.h位於frameworks/av/media/libmedia下:


IMediaPlayer.h中定義的基本上都是虛函數,而我們知道虛函數在C++中就是實現多態性(Polymorphism),多態性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。所以它的功能是一個實現MediaPlayer功能的介面,看到那個onTransact方法,自然聯想Binder通訊,把底層的Parcel指標類型資料向上層向另一個進程中傳遞。
再看下IMediaPlayerClient.h,同樣位於frameworks/av/media/libmedia下:


  • 上面代碼總結為:在內部定義一個BpMediaPlayerClient(也就是Client的父類),然後它也有一個onTransact,一般onXXX都是屬於背動回調過來的,不是由自己控制,如Activity中onCreate,onPause,onStart,這些都是在其他地方處理,通知到Actvitity中的。這裡也是一樣,onTransact作為Binder通訊中的回調方法,前面《Android Multimedia架構總結(四)MediaPlayer中從Java層到C++層類別關係及prepare及之後其他過程》中介紹到player實際上是C/S模式整體,IMediaPlayerClient.h的功能是描述一個MediaPlayer用戶端的介面。

  • 最後總結下:mediaplayer.h的功能是對外(jni層)的介面類,它最主要是定義了一個MediaPlayer類(C++層),我們在android_media_MediaPlayer.cpp中就引入了media/mediaplayer.h,IMediaPlayer.h則是一個實現MediaPlayer(C++層)功能的介面,而IMediaPlayerClient.h的功能是描述一個MediaPlayer用戶端(這裡暫理解為前面說的Client)的介面。

第一時間獲得部落格更新提醒,以及更多android乾貨,源碼分析,歡迎關注我的公眾號,掃一掃下方二維碼或者長按識別二維碼,即可關注。

如果你覺得好,隨手點贊,也是對筆者的肯定,也可以分享此公眾號給你更多的人,原創不易

Android Multimedia架構總結(六)C++中MediaPlayer的C/S架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.