一 简介
AirPlay协议是苹果公司实现的在苹果产品之间传输媒体流信息的一组协议。苹果公司产品之间可以使用该技术自动地互相发现,并且轻松地互相传输音乐、图片及视频文件。此外,AirPlay还有一种镜像(AirPlay Mirroring)功能,可以将iPad或者iPhone的整个屏幕投放到更大屏幕的电视机上,实现“无线投屏”的效果。
AirPlay协议的基础是组播DNS(Multicast Domain Name Server,简称mDNS)协议和DNS服务发现(DNS Service Discovery,简称DNS-SD)协议,它们是IETF Zeroconf工作组(www.zeroconf.org)提出的用于自动寻找设备及服务的网络协议,苹果公司以这两个协议为基础,实现了苹果公司数字家庭网络框架。
AirPlay协议消息发送格式及规则基于mDNS协议(http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt),mDNS协议基于组播技术,定义了家庭各个设备之间的消息的基本格式和接收/发送规则。该协议以DNS协议为基础,并对其消息格式和消息收发顺序作出了一些修改。例如对DNS消息包头进行了简化,使其专注于实现家庭设备的互相发现;另外,考虑到使用组播技术,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协议实现了音频的传输和控制。
目前,苹果官方AirPlay 解决方案只适用于认证过的苹果设备,主要是 iPad、iPhone、Apple TV 以及苹果公司授权伙伴的设备。
一、均通过mDNS协议发现
二、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 \
"-----BEGIN RSAPRIVATE KEY-----\n" \
"MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\n"\
"wC5vOYvfDmFI6oSFXi5ELabWJmT2dKHzBJKa3k9ok+8t9ucRqMd6DZHJ2YCCLlDRKSKv6kDqnw4U\n"\
"wPdpOMXziC/AMj3Z/lUVX1G7WSHCAWKf1zNS1eLvqr+boEjXuBOitnZ/bDzPHrTOZz0Dew0uowxf\n"\
"/+sG+NCK3eQJVxqcaJ/vEHKIVd2M+5qL71yJQ+87X6oV3eaYvt3zWZYD6z5vYTcrtij2VZ9Zmni/\n"\
"UAaHqn9JdsBWLUEpVviYnhimNVvYFZeCXg/IdTQ+x4IRdiXNv5hEewIDAQABAoIBAQDl8Axy9XfW\n"\
"BLmkzkEiqoSwF0PsmVrPzH9KsnwLGH+QZlvjWd8SWYGN7u1507HvhF5N3drJoVU3O14nDY4TFQAa\n"\
"LlJ9VM35AApXaLyY1ERrN7u9ALKd2LUwYhM7Km539O4yUFYikE2nIPscEsA5ltpxOgUGCY7b7ez5\n"\
"NtD6nL1ZKauw7aNXmVAvmJTcuPxWmoktF3gDJKK2wxZuNGcJE0uFQEG4Z3BrWP7yoNuSK3dii2jm\n"\
"lpPHr0O/KnPQtzI3eguhe0TwUem/eYSdyzMyVx/YpwkzwtYL3sR5k0o9rKQLtvLzfAqdBxBurciz\n"\
"aaA/L0HIgAmOit1GJA2saMxTVPNhAoGBAPfgv1oeZxgxmotiCcMXFEQEWflzhWYTsXrhUIuz5jFu\n"\
"a39GLS99ZEErhLdrwj8rDDViRVJ5skOp9zFvlYAHs0xh92ji1E7V/ysnKBfsMrPkk5KSKPrnjndM\n"\
"oPdevWnVkgJ5jxFuNgxkOLMuG9i53B4yMvDTCRiIPMQ++N2iLDaRAoGBAO9v//mU8eVkQaoANf0Z\n"\
"oMjW8CN4xwWA2cSEIHkd9AfFkftuv8oyLDCG3ZAf0vrhrrtkrfa7ef+AUb69DNggq4mHQAYBp7L+\n"\
"k5DKzJrKuO0r+R0YbY9pZD1+/g9dVt91d6LQNepUE/yY2PP5CNoFmjedpLHMOPFdVgqDzDFxU8hL\n"\
"AoGBANDrr7xAJbqBjHVwIzQ4To9pb4BNeqDndk5Qe7fT3+/H1njGaC0/rXE0Qb7q5ySgnsCb3DvA\n"\
"cJyRM9SJ7OKlGt0FMSdJD5KG0XPIpAVNwgpXXH5MDJg09KHeh0kXo+QA6viFBi21y340NonnEfdf\n"\
"54PX4ZGS/Xac1UK+pLkBB+zRAoGAf0AY3H3qKS2lMEI4bzEFoHeK3G895pDaK3TFBVmD7fV0Zhov\n"\
"17fegFPMwOII8MisYm9ZfT2Z0s5Ro3s5rkt+nvLAdfC/PYPKzTLalpGSwomSNYJcB9HNMlmhkGzc\n"\
"1JnLYT4iyUyx6pcZBmCd8bD0iwY/FzcgNDaUmbX9+XDvRA0CgYEAkE7pIPlE71qvfJQgoA9em0gI\n"\
"LAuE4Pu13aKiJnfft7hIjbK+5kyb3TysZvoyDnb3HOKvInK7vXbKuU4ISgxB2bB3HcYzQMGsz1qJ\n"\
"2gG0N5hvJpzwwhbhXqFKA4zaaSrw622wDniAK5MlIE0tIAKKP4yxNGjoD2QYjhBGuhvkWKaXTyY=\n"\
"-----END RSAPRIVATE KEY-----"
三:在iOS App添加Airplay Audio功能
由於Airplay開發者能控制的部分還不多,所以只能透過在自訂播放介面加入MPVolumeView的方式開啟Airplay的功能。
如果需要包含內建的音量控制元件
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