一 簡介
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