AIRPLAY 协议研究

傅博容
2023-12-01

     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, 即使成功上架, 不久也会被强制下架。

 

实现方案选择

纯OC实现iOS

支持Pod安装MRDLNA

后续会发布全部该代码

 类似资料: