AirPlay协议针对苹果设备实现软件层的传输、显示信息交付组的一套私有协议。该技术支持自动地互相发现,互相传输音乐、图片及视频等信息资源文件。此外,AirPlay支持实时传输视频流、音频流功能;可以将iPad或者iPhone的整个屏幕投放到更大屏幕的电视机上,实现所谓很多公司 称为“无线投屏”的效果。
协议的基础是组播DNS(Multicast Domain Name Server,简称mDNS)协议和DNS服务发现(DNS Service Discovery,简称DNS-SD)协议,自动寻找设备及服务的网络协议,苹果内部称为数字家庭网络框架,未来会不断的进行拓宽,这个是本地学习的目的。
AirPlay协议消息格式包基于mDNS协议(http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt),网络连接层称为:组播技术,
苹果优化内容包括
1、定义了设备之间的消息的基本格式和接收/发送规则。
2、该协议以DNS协议为基础,DNS消息包头进行了简化。
3、mDNS在降低网络拥塞和消息冗余方面也作出了很多改进。
在mDNS协议的基础上,DNS-SD协议(http://tools.ietf.org/html/draft-cheshire-dnsext-dns-sd-11)规定了一个服务宣告及使用的完整过程。即设备必须发送什么样的mDNS消息才能完整地宣告并描述自己服务。DNS-SD协议使用PTR、SRV和TXT三种类型的记录全面描述了一个服务的类型,名称以及所在主机的IP和端口号等。
当使用DNS-SD协议实现了对设备及服务的发现和描述后,苹果公司的AirPlay协议规定了图片、音频及视频的传输和控制消息格式,从而实现了智能设备之间的媒体共享和协同动作。例如,在通过DNS-SD获得了其他设备及服务的信息(即设备或服务的IP地址及端口号)之后,AirPlay使用HTTP消息实现了图片和视频的传输及控制,使用RSTP协议实现了音频的传输和控制。
以上描述的包括是 iPad、iPhone、Apple TV 以及苹果公司授权伙伴的设备。
airplay协议学习
很多博文描述的一样
/reverse
协商请求
/scrub
POST方式为seek请求
GET方式为获取播放位置
/volume
设置音量:0.000000为静音,1.000000为最大
/play
播放请求:携带播放链接
本地文件播放为http,网络文件播放为m3u8地址
/rate
播放与暂停:0.000000为暂停,1.000000为播放
/stop
停止播放
/photo
推送图片:在HTTP的Body发送实际图片
/playback-info
获取播放端的状态:总时长、缓冲时长、播放位置、播放器状态(LOADING、PLAYING、PAUSED、STOP)等信息
/server-info
获取服务器信息:主要是mac地址信息
AirTunes处理流程
1、RSA密钥传递音频流加密密钥:
发送端:RSA公钥加密AES密钥,HTTP发送
播放端:RSA私钥解密AES密钥,保存
2、播放音频流:
发送端:AES加密音频流,rtsp推送
播放端:AES密钥解密音频流,播放
3、RSA私钥:
#defineAIRPORT_PRIVATE_KEY \xxxx
正常软件实现包括如下内容:
如果需要包含內建的音量控制元件
MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ;[view addSubview:volumeView];
如果不需要
MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ;
[volumeView setShowsVolumeSlider:NO];[volumeView sizeToFit];[view addSubview:volumeView];
在iOS裡聲音可以分為兩大類,App sound跟System sound,System sound做為按鍵回饋或是警示聲使用,剩下的就是App sound。在MPVolumeView選擇了 Airplay裝置之後,系統會自動把App sound導到支援Airplay的裝置上。
在iOS7,MPVolumeView新增了兩個property
@property areWirelessRoutesAvailable;@property isWirelessRouteActive;
以及兩個通知
NSString *const MPVolumeViewWirelessRoutesAvailableDidChangeNotification;
NSString *const MPVolumeViewWirelessRouteActiveDidChangeNotification;
可以偵測到有airplay以及使用者改變了airplay route,如果想要在偵測到可以使用Airplay裝置時加入動畫這會是一個好的實作方法。
常用通知:
MPVolumeViewWirelessRoutesAvailableDidChangeNotification
airplay是否在通讯:
UIScreenDidConnectNotification and UIScreenDidDisconnectNotification
iOS9中引入了ReplayKit, 让开发者有了一定的获取屏幕数据的能力. 并在iOS10和iOS11中继续扩展了ReplayKit的能力. 但还是有很大的限制, 比如在使用ReplayKit的api时只能录制当前应用的应用, 无法在应用进入后台之后继续录屏. 如果使用系统级别的屏幕录制,又无法获得每一帧的数据,只能获得最后录取的单个视频. 这样对第三方的开发有了非常大的限制.
另外出于个人隐私保护和影视版权保护的考虑,Apple不允许录屏功能的软件上架 AppStore, 即使成功上架, 不久也会被强制下架。
实现方案选择
支持Pod安装MRDLNA
后续会发布全部该代码