iOS中的投屏⽅案:
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 端也看不到任何内容了。也就是说,在这种模式下,⼿机必须⼀直是常亮的。个⼈认为这种模式⽐较适合⽤来做操作演⽰,不太适合⽤来播放视频。
镜像⽅式开启⽅法:
AirPlay video
隔空播放的⽅式其实是在嵌⼊在某个 APP 内部的,在 APP 内部进⾏操作之后,可以隔空将⾳视频和图⽚投送到 TV 上播放。
这种⽅式就像是把⼀个⽂件推送到 TV 端,然后⽤ TV 的屏幕进⾏播放,例如:
腾讯视频 APP 投视频得到 APP 投⾳频系统相册投图⽚该⽅式需要 APP 开发者在软件内部写⼀些代码来⽀持投屏,⽐较适合单个视频的播放。⽐如⽤腾讯视频看电影的时候就可以把视频投到 TV 上去播放,这个时候⼿机是可以直接锁屏的,投放的效果也⾮常不错。
但是这种⽅式仅仅是对⽂件的隔空播放,尚未发现可以⾃定义 TV 端播放页⾯的 API。
隔空播放开启⽅法:
Apple TV 之外的设备接收 AirPlay
⼀般来说只能⽤ Apple TV 作为接收端,不过有很多第三⽅破解了苹果的传输协议,所以很多平台通过安装⼀个接收端软件来模仿 Apple TV 接收 iPhone 等设备投送的数据。
以下为⼀些第三⽅接收软件
AirServer
该软件有 PC 和 Mac 版本的接收端,安装后可以直接接收 iPhone 投送的数据。如果想将 Mac 作为 AirPlay 接收端进⾏投屏,该软件是⾸选。
产品官⽹:
⼿游直播是直播⾏业中⾮常重要的⼀个垂直领域. ⼿游直播与其他移动直播相⽐主要是画⾯的来源不同, ⼿游直播其实是⼀种录屏技术. 游戏玩家在玩游戏的同时将画⾯内容实时地分享展⽰给其他观众, 在配上玩家⾃⼰的语⾳, 能够给观众带来⽐较有趣的观看体验. ⼿游直播与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投屏
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 = @"223.110.239.40:6060/cntvmobile/vod/p_cntvmobile00000000000020150518/m_cntvmobile00000000000659727681";
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (w < unt) {
CLUPnPDevice *model = self.w];
self.dlnaManager.device = model;
self.dlnaManager.playUrl = testUrl;
DLNAControlVC *controlVC = [[DLNAControlVC alloc] init];
[self.navigationController pushViewController:controlVC animated:YES];
}
}
三.投屏
- (void)viewDidLoad {
[super viewDidLoad];
self.dlnaManager = [MRDLNA sharedMRDLNAManager];
[self.dlnaManager startDLNA];
}
四.投屏后的播放控制
/**
退出
*/
- (IBAction)closeAction:(id)sender {
[self.dlnaManager endDLNA];
}
/**
播放/暂停
*/
app开发者需要更新此app以在此ios上正常使用
- (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 = @"wvideo.spriteapp/video/2016/0328/56f8ec01d9bfe_wpd.mp4";
[self.dlnaManager playTheURL:testVideo];
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。