iOS中的投屏方案:
1, ReplayKit
iOS9中引入了ReplayKit, 讓開發者有了一定的獲取屏幕數據的能力. 並在iOS10和iOS11中繼續擴展了ReplayKit的能力. 但還是有很大的限制, 比如在使用ReplayKit的api時只能錄制當前應用的應用, 無法在應用進入后台之后繼續錄屏. 如果使用系統級別的屏幕錄制,又無法獲得每一幀的數據,只能獲得最后錄取的單個視頻. 這樣對第三方的開發有了非常大的限制.
2, Airplay
Airplay是蘋果提供的一種多屏互動技術, 可以將音頻照片,視頻, 屏幕從iOS設備或者Mac電腦上投射到支持airplay接受的設備上,如Apple TV。這樣可以將小屏映射到大屏,可以無線音樂,可以圖片分享等等. 但是Airplay屬於蘋果私有協議方案,設備間的協商與傳輸過程都進行了加密處理,並不能用於其他平台中。我們已經完整的逆向了Airplay的全部協議棧,並破解了其加密方案,可以提供跨平台Airplay接收方案。這樣可以方便實現跨平台的多屏共享。
樂聯協議支持三種協議:
一是蘋果原生自帶的airplay,
二是應用內的DLNA推送協議
三是樂播自已研發的私有協議-“樂聯”。
1·在安卓手機上,樂播用的是自己的私有協議,讓安卓手機上實現跟airplay一樣優越的鏡像及推送功能。
2·樂聯協議采用純軟件解決方案,廠商與用戶都無需加購硬件。樂聯協議獨有直播流投屏技術,是一家能夠將手機在線直播,實時無線投屏的方案商。
3·目前已經有7000萬塊的智能大屏出廠預裝了樂播投屏的接收技術。因此無論從哪個視頻APP發送的投屏請求,都能被電視大屏全格式接收。
4·支持全流媒體格式投屏,原來DLNA無法投屏電視格式的問題,也游刃而解。 獨自開發支持禮物流投屏,彈幕流投屏。
iOS AirPlay 投屏
蘋果投屏功能主要基於 AirPlay,可以隔空播放音視頻和圖片。蘋果原生的 AirPlay 有發送端和接收端之分,分別為以下設備
發送端:
iPhone iPad iPod touch Mac 接收端:Apple TV
按照常規的使用方法,只能投到 Apple TV 上面。
雖然 AirPlay 傳輸協議是蘋果私有的,不過很多廠商逆向破解了 AirPlay 傳輸協議,所以只要國內的各種安卓電視盒子安裝了對應的接收軟件,也能夠接收 iPhone 的投屏。
AirPlay 使用的時候有幾種使用模式,在 iPhone 上目前主要分為兩種模式:
Mirror device's screen (屏幕鏡像) AirPlay video (隔空播放音視頻) Mirror device's screen
屏幕鏡像模式是一種全局的操作,在手機的控制面板開啟。一般來說,在該模式下,手機上顯示什么,TV 上就顯示什么,直接將手機內容展示到 TV 的顯示器上面。
雖然這種模式叫鏡像模式,但是,其實在這種模式下,APP 內部可以寫代碼檢測是否開啟了鏡像模式,可以針對 Apple TV 的屏幕寫一屏新的 UI,也就是手機和 TV 的顯示屏展示內容可以不同,相當於外接了一個屏幕,展示新的內容。通過這種方法,可以把手機頁面作為一個遙控器,真正展示內容可以放到 TV 的屏幕。
在使用鏡像模式的時候,如果手機鎖屏,TV 端也看不到任何內容了。也就是說,在這種模式下,手機必須一直是常亮的。個人認為這種模式比較適合用來做操作演示,不太適合用來播放視頻。
鏡像方式開啟方法:https://support.apple.com/zh-cn/HT204289#mirroriOS
AirPlay video
隔空播放的方式其實是在嵌入在某個 APP 內部的,在 APP 內部進行操作之后,可以隔空將音視頻和圖片投送到 TV 上播放。
這種方式就像是把一個文件推送到 TV 端,然后用 TV 的屏幕進行播放,例如:
騰訊視頻 APP 投視頻 得到 APP 投音頻 系統相冊投圖片 該方式需要 APP 開發者在軟件內部寫一些代碼來支持投屏,比較適合單個視頻的播放。比如用騰訊視頻看電影的時候就可以把視頻投到 TV 上去播放,這個時候手機是可以直接鎖屏的,投放的效果也非常不錯。
但是這種方式僅僅是對文件的隔空播放,尚未發現可以自定義 TV 端播放頁面的 API。
隔空播放開啟方法:https://support.apple.com/zh-cn/HT204289#iOS
Apple TV 之外的設備接收 AirPlay
一般來說只能用 Apple TV 作為接收端,不過有很多第三方破解了蘋果的傳輸協議,所以很多平台通過安裝一個接收端軟件來模仿 Apple TV 接收 iPhone 等設備投送的數據。
以下為一些第三方接收軟件
AirServer
該軟件有 PC 和 Mac 版本的接收端,安裝后可以直接接收 iPhone 投送的數據。如果想將 Mac 作為 AirPlay 接收端進行投屏,該軟件是首選。
產品官網:https://www.airserver.com
手游直播是直播行業中非常重要的一個垂直領域. 手游直播與其他移動直播相比主要是畫面的來源不同, 手游直播其實是一種錄屏技術. 游戲玩家在玩游戲的同時將畫面內容實時地分享展示給其他觀眾, 在配上玩家自己的語音, 能夠給觀眾帶來比較有趣的觀看體驗. 手游直播與PC端游戲直播相比主要是設備的計算能力不同。 PC游戲直播有OBS等強大的第三方直播軟件, 加上PC強勁有富余的計算能力, 使得PC游戲直播的門檻相對較低。 手游直播中由於Apple對個人隱私和安全性的重視, iOS手游直播相對於Android手游直播的難度又大了很多。
一. 現有iOS錄屏方案分析
為了解決iOS手游直播中視頻數據采集的難題, 主要存在以下三種方案:
通過私有API獲取系統的IOSurface 這種方法效率比較高, 但是從iOS9 開始, 這個私有API的漏洞就被Apple堵上了, 新系統中無法使用;
Airplay Screen Mirroring Airplay 是 Apple 提供的一種遠程播放技術, 可以將iPhone、iPod touch、iPad及Mac上的音頻,照片,ppt, 視頻和系統界面鏡像等內容傳送到同一局域網中支持Airplay的設備(如:音箱、Apple TV)中播放. 其中Airplay Screen Mirroring 就是用於屏幕投影的功能,有iOS系統自身將屏幕內容進行采集壓縮,通過網絡投屏的其他設備上. 但 Airplay 是Apple的私有協議組, 並且為了安全考慮, 傳輸過程中音視頻數據都是用Apple私有的Fairplay加密的, 因此要想獲得這些數據, 必須破解Airplay的協議和並且破解Fairplay加密方式。 另外出於個人隱私保護和影視版權保護的考慮,Apple不允許錄屏功能的軟件上架 AppStore, 即使成功上架, 不久也會被強制下架。
ReplayKit
ReplayKit Apple 注意到了廣大用戶對手游直播的呼聲, 從iOS 9開始提供了ReplayKit, 給了用戶主動對外分享屏幕內容的能力. 對與Replaykit, Apple在不斷的增強, iOS9的時候還只能把特定App的畫面錄制成MP4的片段, 到iOS10 能夠獲取特定App的原始圖像和聲音, 到iOS11, 能夠從系統級啟動錄制, 獲得所有APP包括桌面的畫面. 但是Replaykit是以APP擴展的方式存在的, 真正接受到畫面, 進行壓縮發送的部分, 並不是一個完整的應用程序, 而是一個在后台運行的擴展. Airplay則可以作為一個在后台運行的App, 相對來說, 完整App的穩定性和可控程度在現階段可能要優於App擴展。
視頻投屏是什么原理:
視頻投屏的通道有DLNA投屏和airplay投屏和Lelink(樂播投屏協議)這三大協議通道。有了這三個協議通道。就好像藍牙一樣,手機和電視通過互相配對,建立了一個通道,連接之后,手機就可以不斷地把視頻地址發射給電視。從而電視播放視頻。完成投屏。
- iOS DLNA投屏 MRDLNA
Pod安裝MRDLNA
一. 設置代理搜索設備
self.dlnaManager = [MRDLNA sharedMRDLNAManager]; self.dlnaManager.delegate = self;
調用開始搜索后就會搜索整個局域網中支持投視頻的設備
- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.dlnaManager startSearch]; }
二.發現設備后的回調
發現設備后在代理中可以拿到
- (void)searchDLNAResult:(NSArray *)devicesArray{ NSLog(@"發現設備"); self.deviceArr = devicesArray; [self.dlnaTable reloadData]; }
//devicesArray中拿到的是CLUPnPDevice類型的對象復制代碼 Demo中將搜索頁面和投屏控制頁面分開來的,所以在搜索頁面搜索到設備后就把目標設備和播放Url設置給了dlnaManager
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSString *testUrl = @"http://223.110.239.40:6060/cntvmobile/vod/p_cntvmobile00000000000020150518/m_cntvmobile00000000000659727681"; [tableView deselectRowAtIndexPath:indexPath animated:YES]; if (indexPath.row < self.deviceArr.count) { CLUPnPDevice *model = self.deviceArr[indexPath.row]; self.dlnaManager.device = model; self.dlnaManager.playUrl = testUrl; DLNAControlVC *controlVC = [[DLNAControlVC alloc] init]; controlVC.model = model; [self.navigationController pushViewController:controlVC animated:YES]; } }
三.投屏
- (void)viewDidLoad { [super viewDidLoad]; self.dlnaManager = [MRDLNA sharedMRDLNAManager]; [self.dlnaManager startDLNA]; }
四.投屏后的播放控制
/** 退出 */ - (IBAction)closeAction:(id)sender { [self.dlnaManager endDLNA]; } /** 播放/暫停 */ - (IBAction)playOrPause:(id)sender { if (_isPlaying) { [self.dlnaManager dlnaPause]; }else{ [self.dlnaManager dlnaPlay]; } _isPlaying = !_isPlaying; } /** 進度條seek單位是秒 */ - (IBAction)seekChanged:(UISlider *)sender{ NSInteger sec = sender.value * 60 * 60; NSLog(@"播放進度條======>: %zd",sec); [self.dlnaManager seekChanged:sec]; } /** 音量volume建議傳0-100之間字符串 */ - (IBAction)volumeChange:(UISlider *)sender { NSString *vol = [NSString stringWithFormat:@"%.f",sender.value * 100]; NSLog(@"音量========>: %@",vol); [self.dlnaManager volumeChanged:vol]; } /** 切集 */ - (IBAction)playNext:(id)sender { NSString *testVideo = @"http://wvideo.spriteapp.cn/video/2016/0328/56f8ec01d9bfe_wpd.mp4"; [self.dlnaManager playTheURL:testVideo]; }