Android上开发Airplay Server端的问题求助
发布网友
发布时间:2022-04-25 22:16
我来回答
共1个回答
热心网友
时间:2022-06-18 01:42
前段时间刚做完Airplay的相关应用,现在就开发的一点经验和大家分享一下。
首先,说说Airplay吧,Airplay可以将iPhone,iPad或iPodtouch等设备上的视频、音频以及图片传输到第三方认证设备上,一般是在AppleTV或Air port设备上,但其实,现在很多第三方的android设备也可以支持Airplay了,像阿里云或小米的盒子都支持Airplay投影了,而且效果都还不错。
其实,Airplay算是苹果公司定义的一种协议,或是一种技术吧,所以,按照惯例,这项技术是不开源的,对外封闭。而Android端,可以使用一套的多屏互动方案的,叫做DLAN,即Digital Living Network Alliance,它的协议是公开的。在次,得感谢诸多技术大牛,破解了Airplay,包括音频投影服务中使用的RSA私钥,和一份具体的协议说明(http://nto.github.io/AirPlay.html)。
下面,就Airplay协议内容大概的说明一下,当然,大家直接看上述地址中的内容也许更清楚,本人能力有限,大概的说说我的部分理解。
1.使用multicastDNS协议来进行服务发现,在android端可以用JmDNS来实现。
一般我们会发布两个服务:AirTunes service(RAOP)和AirPlay Service,前者用于音频流的投影,后者用于图片和视频内容的投影。
2.协议内容(一):AirTunesService
2.1.协议中的音频流支持RTSP协议。
1)IOS设备向服务端发送的RTSP请求包括
ANNOUNCE:告诉RTSP服务器关于流的各种属性
SETUP:告诉RTSP服务器初始化一个record session,同时通知必要的传输信息。
RECORD:请求服务器开始流的传输
FLUSH:请求停止传输
TEARDOWN:请求结束RTSP会话
PAUSE, OPTIONS,
GET_PARAMETER,
SET_PARAMETER:可用于音量控制,Metadata:其中包括音频曲名,歌手名,专辑名,封面图片,播放进度信息……
POST and GET
2)RTP流,用于传输音频数据等。(如果说,RTSP用于发起/终结流媒体,那么RTP则传输流媒体数据 )
这里音频包是几乎完全兼容RTP协议。RTP包按有效载荷的不同类型分为以下几种:
Audio packets:其有效载荷为经过加密的audio data
Sync packets:服务端每秒钟会收到一个同步包,来将RTP中的timestamps与用于始终同步的NTP time关联起来
Retransmit packets:对丢失的audio packets进行重传
Timing packets:用于音频的主时钟同步
2.2音频数据加密解密
Client:客户端首先会用RSA公钥,利用OAEP加密方式自动生成一个随机的128位AES key,然后和rsaaes key,aesiv一起发送给Server。
Sever:服务端利用指定的RSA私钥来解密AES key,然后将解密结果返回给Client。
Client:客户端利用RSA公钥要解密收到的数据,若解密结果和之前自动生成的随机数一致,则表明服务端解密成功。