免費企業(yè)網(wǎng)站建立企業(yè)郵箱查詢
#android手機投屏
####導(dǎo)語
至于手機投屏的實現(xiàn)方法可謂五花八門,今天小袁就說下以開發(fā)人員的角度來說下當(dāng)今手機的主流投屏方法。目前這種將終端信號經(jīng)由WiFi傳輸?shù)诫娨暋㈦娨暫械募夹g(shù)有三種:DLNA、AirPlay、Miracast、Google Cast。
##手機投屏智能電視的幾種方法
###DLNA 專業(yè)術(shù)語:DLNA的全稱是DIGITAL LIVING NETWORK ALLIANCE(數(shù)字生活網(wǎng)絡(luò)聯(lián)盟)。 DLNA(Digital Living Network Alliance) 由索尼、英特爾、微軟等發(fā)起成立、旨在解決個人PC,消費電器,移動設(shè)備在內(nèi)的無線網(wǎng)絡(luò)和有線網(wǎng)絡(luò)的互聯(lián)互通。 DLNA 2003年誕生是為了能夠把當(dāng)時相互獨立的電視機及其相關(guān)設(shè)備(功放、音響、DVD/藍光播放機)、PC及其相關(guān)設(shè)備(數(shù)碼相機、音樂播放器)和移動電話在家庭中有機地整合起來,使得多媒體內(nèi)容能夠在各個設(shè)備上便捷地播放。
通俗術(shù)語: DLNA(數(shù)字生活網(wǎng)絡(luò)聯(lián)盟) 就是大佬們一起搞事情 商討“我們要將物聯(lián)網(wǎng)設(shè)備連接起來,怎么搞啊?” 搞著搞著 就搞出了這套設(shè)備的工業(yè)標(biāo)準。 然后讓其他設(shè)備具備 DLNA 這種工業(yè)標(biāo)準,這樣這些設(shè)備就可以互聯(lián)互通了。
####UPnp協(xié)議
DLNA 標(biāo)準包括多項協(xié)議及標(biāo)準,其中最重要的部分是 UPnP 協(xié)議?UPnP是由“通用即插即用論壇”(UPnP Forum)推廣的一套網(wǎng)絡(luò)協(xié)議,它的目標(biāo)是實現(xiàn)設(shè)備間網(wǎng)絡(luò)互聯(lián)。
- UPnP協(xié)議定義了設(shè)備之間,設(shè)備和控制點,控制點之間通信的協(xié)議
- 完整的UPnP協(xié)議棧由設(shè)備尋址、設(shè)備發(fā)現(xiàn)、設(shè)備描述、設(shè)備控制、事件通知以及基于Html的描述等幾部分構(gòu)成
?看到這個圖有沒有想到?OSI 七層模型? 我從下至上來介紹一下:
ip網(wǎng)絡(luò)協(xié)議 大哥哥 IP:就是ip網(wǎng)絡(luò)協(xié)議。 為什么需要它? 因為用到網(wǎng)絡(luò)層數(shù)據(jù)的傳輸,IP層用于數(shù)據(jù)的發(fā)送與接收。 想象一下兩個設(shè)備互聯(lián),其實就是在網(wǎng)絡(luò)互聯(lián),所以需要網(wǎng)絡(luò)層協(xié)議。
?TCP-UDP
這里包含了UDP和TCP兩塊協(xié)議。 這里圖應(yīng)該這樣表示:?
?UDP協(xié)議跟IP協(xié)議組合成:UDP/IP協(xié)議 而 HHTPMU 和 HTPU 這兩個協(xié)議是基于 UDP/IP 協(xié)議之上的。 TCP協(xié)議跟IP協(xié)議組合成:TCP/IP 協(xié)議 HTTP 則是基于 TCP/IP 協(xié)議上。
TCP/IP 協(xié)議大家應(yīng)該都了解,但為何出現(xiàn)一個 UDP/IP 呢? 使用UDP,可以通過多點傳送(Multicast)向 LAN 上所有支持UPnP的設(shè)備發(fā)送新設(shè)備接入的通知。這里流媒體 也會使用 UDP 來傳輸,因為速度快。
HHTPMU 和 HHTPU 是什么? 它是構(gòu)建在 TCP/IP 協(xié)議之上的是 HTTP 協(xié)議及其變種,所有 UPnP 消息都被封裝在 HTTP 協(xié)議及其變種中。HTTP 協(xié)議的變種是 HTTPU 和 HTTPMU,這些協(xié)議的格式沿襲了 HTTP 協(xié)議,只不過與 HTTP 不同的是他們通過 UDP 而非 TCP 來承載的,并且可用于組播進行通信。 可見 它之所以存在就是替換 TCP 為 UDP。
接下來就是 設(shè)備發(fā)現(xiàn) | 設(shè)備控制 | 設(shè)備事件 協(xié)議了: 1、設(shè)備發(fā)現(xiàn) SSDP 協(xié)議 簡單服務(wù)發(fā)現(xiàn)協(xié)議(Simple Service Discovery Protocol:SSDP) 具體包括控制點如何發(fā)現(xiàn)網(wǎng)絡(luò)上有哪些服務(wù),以及這些服務(wù)的資訊,還有控制點本身宣告他提供哪些服務(wù)。
2、控制設(shè)備 SOAP 協(xié)議 簡單對象訪問協(xié)議(Simple Object Access Protocol:SOAP) 它定義如何使用 XML 與 HTTP 來執(zhí)行遠程過程調(diào)用。包括控制點如何發(fā)送命令消息給設(shè)備,設(shè)備收到命令消息后如何發(fā)送響應(yīng)消息給控制點。
3、設(shè)備事件 GENA 協(xié)議 通用事件通知架構(gòu)(Generic Event Notification Architecture:GENA) 定義在控制點想要監(jiān)聽設(shè)備的某個服務(wù)狀態(tài)變量的狀況時,控制點如何傳送訂閱信息并如何接收這些信息。
體系定義?
?這一層僅僅是一個抽象的、公用的設(shè)備模型。就是一個規(guī)范 定義,所有的 UPnP 設(shè)備都必須使用這層。?
?UPnP論壇 UPnP 論壇的各個專業(yè)委員會的設(shè)備定義層,在這個論壇中,不同電器設(shè)備由不同的專業(yè)委員會定義,例如:電視委員會只負責(zé)定義網(wǎng)絡(luò)電視設(shè)備部分,空調(diào)器委員會只負責(zé)定義網(wǎng)絡(luò)空調(diào)設(shè)備部分,依此類推。?
?UPnP設(shè)備制造廠商定義 也就是應(yīng)用層,由 UPnP 設(shè)備制造廠商定義的部分。
###Miracast
Miracast是由Wi-Fi聯(lián)盟于2012年所制定,以Wi-Fi直連為基礎(chǔ)的無線顯示標(biāo)準。支持此標(biāo)準的設(shè)備可通過無線方式分享視頻畫面,例如手機可通過Miracast將影片或照片直接在電視或其他裝置播放而無需受到連接線纜長度的影響。與DLNA不同的是,Miracast 也有類似于AirPlay 的鏡像功能,可以將手機中屏幕內(nèi)容直接投放到高清電視屏幕里,這樣你也可以通過電視屏幕來玩游戲了。Android4.2版本以后系統(tǒng)標(biāo)配此功能(在設(shè)置或顯示菜單中可以找到,應(yīng)用名稱諸如:Wlan display、Wifi display、Miracast、Allshare cast、Mirroring screen、無線顯示等,只是各手機廠家命名不同而已)??梢詫⑹謾C屏幕通過無線顯示接收器將畫面無線傳輸?shù)狡渌^大屏幕上,如客廳電視,會議室投影儀。畫面?zhèn)鬏斞訒r150ms以下,幾乎同時。點擊此功能,但沒有任何反應(yīng),因為此項功能需要配件支持。
###AirPlay
AirPlay 是蘋果開發(fā)的一種無線技術(shù),可以通過WiFi將iPhone 、iPad、iPodtouch 等iOS 設(shè)備上的包括圖片、音頻、視頻通過無線的方式傳輸?shù)街С諥irPlay 設(shè)備。售價99美元的Apple TV就具備這樣的功能,現(xiàn)在一些傳統(tǒng)的家庭影院和HIFI如馬蘭士和天龍的新品功放和網(wǎng)絡(luò)播放器已經(jīng)支持AirPlay功能。
AirPlay具備與DLNA所沒有的鏡像功能,這一功能叫AirPlay鏡像,可將iPhone 或iPad 上的畫面無線傳輸?shù)诫娨暽?#xff0c;也就是說你設(shè)備顯示的是什么,電視屏幕顯示就就是什么,而不僅限于圖片和視頻。你可以拿著iPad 來當(dāng)做方向盤,然后看著大屏玩游戲。
另外AirPlay鏡像最牛地方是它可以實現(xiàn)雙屏游戲,讓你的游戲有更多的交互。比如,電視里顯示的是游戲畫面,而iPad上顯示的是比賽的路線圖。
###Google Cast
谷歌官方的文檔
谷歌官方的demo
因為國內(nèi)的手機基本都是閹割版本的。因為不需要使用Google Play,所以國內(nèi)很多手機需要下載好谷歌的三件套才能使用,然后就是谷歌官方的硬件Chromecast,在國內(nèi)基本很難用,因為要用訪問谷歌的服務(wù)器,所以需要外網(wǎng)才行, 我在集成Chromecast中遇到的坑
#####申請id
*使用Styled Media Receiver類型注冊,獲取id,然后替換官方demo的id就不會有sample這個水印了,我開始用的Custom Receiver類型注冊,水印還在。
#####Android代碼加入
compile 'com.google.android.gms:play-services-cast-framework:10.0.1'//這里要用低版本,困擾兩天compile 'com.googlecode.android-query:android-query:0.25.9'compile 'com.android.support:mediarouter-v7:25+'
#####投屏關(guān)鍵代碼
private MediaInfo buildMediaInfo() {MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);movieMetadata.putString(MediaMetadata.KEY_SUBTITLE, mTitle);movieMetadata.putString(MediaMetadata.KEY_TITLE, "第" + mPart + "集");movieMetadata.addImage(new WebImage(Uri.parse(mPictureUrl)));movieMetadata.addImage(new WebImage(Uri.parse(mPictureUrl)));// Log.e(TAG, "buildMediaInfo" + mSelectedMedia.getUrl() + " " + mSelectedMedia.getDuration() * 1000);//第一條為谷歌,第二條為我加密,三 不加密 4 網(wǎng)路不加密// return new MediaInfo.Builder("https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/hls/WhatCarCanYouGetForAGrand.m3u8")// return new MediaInfo.Builder("https://cdn61.ytbbs.tv/cn/tv/55550/55550-1/play.m3u8?md5=QXaEWg8r8NkZJo9ln0cZwg&expires=1521010007&token=55550")// return new MediaInfo.Builder("https://cdn61.ytbbs.tv/cn/tv/54063/54063-1/play.m3u8?md5=DRhHA6ToB4z43_32sex0kw&expires=1521012980&token=54063")// return new MediaInfo.Builder("http://cdn14.ytbbs.tv/666/ds3/play.m3u8")// return new MediaInfo.Builder(mSelectedMedia.getUrl())// url = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4";//url = "https://cdn61.ytbbs.tv/666/ds3/ds3s.mp4";LogUtils2.logi(TAG, "buildMediaInfo" + url);return new MediaInfo.Builder(url).setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setContentType("application/vnd.apple.mpegurl")// .setContentType("application/x-mpegurl")// .setContentType("videos/m3u8")// .setContentType("videos/mp4").setMetadata(movieMetadata).setStreamDuration(0).build();}
setContentType里面MIME值類型非常重要。很多小伙伴投屏失敗就是因為沒有使用正確的__MIME__類型
###DLNA和Miracast區(qū)別
DLNA是基于文件的,媒體文件可能有各種各樣的編碼格式,播放器這端必須能夠處理這么多種編碼格式。通常為了比較好的播放體驗,DLNA會先緩存一小段時間。 Miracast是實時的,它可以實時傳輸源端(Source)的輸出。源端任何屏幕的操作都會被傳輸?shù)浇邮?Sink)端。如果源端是播放媒體文件,源端負責(zé)先對媒體文件解碼,然后再編碼成H.264的格式。接收端只需要做H.264的解碼就可以了。相對DLNA,Miracast對于WiFi通路的要求要更高一些。