相关资料

Unofficial AirPlay Protocol Specification

Android 开发 AirPlay Server

AirReceiver 使用Java写的运行在PC端的AirPlay接收端

DroidAirPlay 基于AirReceiver代码转换成安卓项目的实现代码

AndroidAirPlayReceiver基于DroidAirPlay改造后能直接使用的安卓工程

https://www.ietf.org/rfc/rfc2326.txt

相关技术

服务发现:
mDns
ssdp

流程

转自知乎大佬 刘同学被占用了

https://zhuanlan.zhihu.com/p/34324606

Airplay Mirroring客户端的同屏交互过程,分为三个主要步骤:

1, 设备广播与发现

2, 信息交互与能力协商

3, 音视频数据接收与解扰

设备广播与发现:

Airplay设备间的广播与发现通过Bonjour协议进行。Bonjour也被称为ZeroConf, mDNS等,可以用来在局域网内进行数据记录广播与发现。该协议比较成熟,网上可以找到诸多介绍。对于实现的Airplay(包括Mirroring)接收端而言,首先需要注册两类服务,即airtunes和airplay。 Airtunes服务主要用来处理广播视音频接收能力协商,是最为重要的服务内容,对应Bonjour记录名称为’_raop._tcp’,注册服务端口不限,一般为了避免冲突,建议采用较高的端口数;Airplay服务主要用来兼容传统的streaming等服务,对应记录名称为’_airplay._tcp’,注册端口一般为7000。

具体的服务广播内容,可以进行局域网抓包,找到对应记录内容。

当接收端通过Bonjour广播器服务能力后,发送端(如iPhone等各类iOS设备)就可以发现该接收端。

信息交互与能力协商:

当发送端发现接收端后,可以开始信息交互与能力协商过程。该部分协议协议格式类似rtsp协议格式。主要分为两个阶段,设备匹配与和能力协商。

当发送端链接服务端后,设备匹配过程即开始。通信双方会进行fairplay加密协议进行信息交换,当完成信息交换后,客户端后续必须使用这部分信息来处理加密过的密钥,才能获得进一步视音频解密密钥。在iOS9之后,在fairplay过程之前,增加一个设备匹配过程,即pair-setup、pair-verify过程,其主要算法是较为标准的非对称公钥交换算法。

当两端成功匹配后,开始进行能力协商与信息交换,这些信息包括,设备名称、代号,音视频接收相关端口配置,视频接收能力以及加密密钥等,相关信息使用binary plist格式进行封装。

可以参考https://github.com/espes/Slave-in-the-Magic-Mirror找到相关协议交互的一些细节。

音视频数据接收与解密

双方协商成功后,发送端开始向接收端发送视音频数据,mirroring数据是通过TCP进行发送,为h.264 ES流格式。音频是通过RTP协议进行发送,根据内容的不同音频编码为ALAC或者AAC-ELD。

音视频流都是通过AES进行了加密处理,密钥需要通过上面一步的进过信息交互后的fairplay模组对setup过程中接收到的加密密钥进行解密,获得的AES解密需要的IV和KEY,然后经过AES解扰,即可以获得最终的视音频清流。

其他需要注意的地方:

Airplay没过Session传送过来的视频h264码流,只有开头一个关键帧. 因此这种情况并不适合直播这种需要固定GOP的场景. 还需要做进一步的转码的工作,或者直接在压缩域进行处理,获得合理的GOP结构。

广播发现

协议交互

https://blog.csdn.net/mirkerson/article/details/8601333?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242

/info

request:

response:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>pk</key><data>XYMxJlYMsZoUGTcneJbw/UN7poAeshCsTDnZAHLXDag=</data><key>name</key><string>Apple TV</string><key>vv</key><integer>2</integer><key>statusFlags</key><integer>68</integer><key>keepAliveLowPower</key><integer>1</integer><key>keepAliveSendStatsAsBody</key><integer>1</integer><key>pi</key><string>b08f5a79-db29-4384-b456-a4784d9e6055</string><key>sourceVersion</key><string>220.68</string><key>deviceID</key><string>00:50:56:C0:00:01</string><key>macAddress</key><string>00:50:56:C0:00:01</string><key>model</key><string>AppleTV3,2</string><key>audioFormats</key><array><dict><key>audioInputFormats</key><integer>67108860</integer><key>audioOutputFormats</key><integer>67108860</integer><key>type</key><integer>100</integer></dict><dict><key>audioInputFormats</key><integer>67108860</integer><key>audioOutputFormats</key><integer>67108860</integer><key>type</key><integer>101</integer></dict></array><key>audioLatencies</key><array><dict><key>audioType</key><string>default</string><key>inputLatencyMicros</key><false/><key>outputLatencyMicros</key><false/><key>type</key><integer>100</integer></dict><dict><key>audioType</key><string>default</string><key>inputLatencyMicros</key><false/><key>outputLatencyMicros</key><false/><key>type</key><integer>101</integer></dict></array><key>features</key><integer>130367356918</integer><key>displays</key><array><dict><key>height</key><integer>1080</integer><key>width</key><integer>1920</integer><key>rotation</key><false/><key>widthPhysical</key><false/><key>heightPhysical</key><false/><key>widthPixels</key><integer>1920</integer><key>heightPixels</key><integer>1080</integer><key>refreshRate</key><real>0.016667</real><key>maxFPS</key><integer>60</integer><key>features</key><integer>14</integer><key>overscanned</key><false/><key>uuid</key><string>e5f7a68d-7b0f-4305-984b-974f677a150b</string></dict></array>
</dict>
</plist>

SETUP

response:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>timingPort</key><integer>6000</integer><key>eventPort</key><integer>47010</integer><key>streams</key><array><dict><key>type</key><integer>96</integer><key>controlPort</key><integer>6001</integer><key>dataPort</key><integer>6003</integer></dict></array>
</dict>
</plist><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>et</key><integer>32</integer><key>eiv</key><data>aAW66U8aj8bSvSFEJYVr1w==</data><key>timingProtocol</key><string>NTP</string><key>sessionUUID</key><string>F2F647DB-1E87-4AA6-B2AF-AA6CE0BF9D3F</string><key>osName</key><string>iPhone OS</string><key>osBuildVersion</key><string>17F80</string><key>sourceVersion</key><string>420.45</string><key>timingPort</key><integer>53648</integer><key>isScreenMirroringSession</key><true/><key>osVersion</key><string>13.5.1</string><key>ekey</key><data>RlBMWQECAQAAAAA8AAAAACbSNQTFG57dB11iWsNtMj8AAAAQvJ5sT/YIec4lRLGGRXsiHZ0UBENC+6P6Vco8NOvFLRsXN1Qi</data><key>deviceID</key><string>F8:95:EA:78:14:F0</string><key>model</key><string>iPhone10,3</string><key>name</key><string>姝︽眽鐨勬祴璇曟満iPhoneX 2</string><key>macAddress</key><string>F8:95:EA:83:87:59</string>
</dict>
</plist><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>timingPort</key><integer>0</integer><key>eventPort</key><integer>46001</integer><key>streams</key><array><dict><key>type</key><integer>110</integer><key>dataPort</key><integer>46000</integer></dict></array>
</dict>
</plist>

音视频接收

[资料]airplay协议相关推荐

  1. 关于airplay协议实现镜像功能研究

    工作中需要研究airplay以实现IOS的镜像服务端,将了解到的内容记录下来. Airplay可以实现将设备中音频.视频.图像通过本地无线网络发送远端设备:Airplay功能实现利用了很多标准协议,包 ...

  2. AIRPLAY 协议研究

       AirPlay协议针对苹果设备实现软件层的传输.显示信息交付组的一套私有协议.该技术支持自动地互相发现,互相传输音乐.图片及视频等信息资源文件.此外,AirPlay支持实时传输视频流.音频流功能 ...

  3. 苹果Airplay协议以及AirTunes流程总结

    一.均通过mDNS协议发现 二.airplay协议总结 /reverse 协商请求 /scrub POST方式为seek请求 GET方式为获取播放位置 /volume 设置音量:0.000000为静音 ...

  4. airplay协议开发第3部(mdnsd注册airplay服务)

    1 服务注册 Airplay通过mdnsd对外发布2个服务,在发布服务的时候,说明自己支持的功能.例如,在发布 raop服务的时候,会说明传输音频是使用UDP还是TCP. 那么,手机在发现raop服务 ...

  5. airplay协议开发第2部(介绍接口、视频、音频的操作)

    1 AirplayLibrary项目提供的接口 AirplayLibrary项目编译出Airplay.dll动态库,对外提供的接口函数如下: //=========================== ...

  6. AirPlay协议结构record

    AirPlay协议非官方文档 参考博文 关于airplay协议实现镜像功能研究 They are based on well-known standard networking protocols s ...

  7. 关于AirPlay协议(一)

    一 简介 AirPlay协议是苹果公司实现的在苹果产品之间传输媒体流信息的一组协议.苹果公司产品之间可以使用该技术自动地互相发现,并且轻松地互相传输音乐.图片及视频文件.此外,AirPlay还有一种镜 ...

  8. 【转】DICOM协议新手入门资料-DICOM协议详细解释!!

    转自:https://blog.csdn.net/zhuwei0710/article/details/82620036 数字影像传输标准协议的初衷,是为了在不同厂商生产的数字影像设备之间实现影像及其 ...

  9. Airplay相关协议

    前段时间刚做完Airplay的相关应用,现在就开发的一点经验和大家分享一下. 首先,说说Airplay吧,Airplay可以将iPhone,iPad或iPodtouch等设备上的视频.音频以及图片传输 ...

最新文章

  1. 嵌入式开发之网络心跳包---阻塞和非阻塞以及是否有必要心跳包heartbeat
  2. 错误日志这样排查,干活更得劲了!!
  3. 从公司发展看技术人才需求
  4. solr mysql 自动同步_MongoDB和Solr的整合以及实现数据同步功能
  5. 计算机系统启动的加点顺序是,操作系统引导探究
  6. SAP License:CO-FI实时集成
  7. pyqt5 python3.4_Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台
  8. 产品配件删除,内容保存
  9. python有几种_Python常见的几种算法
  10. jQuery 停止动画
  11. python输出姓名_Python简单生成随机姓名的方法示例
  12. C# 扫描识别图片中的文字(.NET Framework)
  13. C/S、B/S架构模式的三层结构特点分析
  14. VOIP流中使用CNN-LSTM下对QIM的隐写分析方法
  15. 使用Vue前端框架实现知乎日报app
  16. 安卓手机主题软件_安卓手机赚钱软件
  17. 中国最大的“隐形首富”,掌舵中国最大汽车集团,身价高达760亿
  18. 微信开通状态检测工具(免验证码版)运行原理
  19. 阿里大变局,马云女弟子掌舵淘宝
  20. 包裹细胞膜的磁性纳米微载体/负载斑蝥素的巨噬细胞膜包封金属有机框架纳米颗粒的研究

热门文章

  1. mask_rcnn 版本过高的错误
  2. Spring Boot笔记(七) springboot 集成 JavaMail 实现邮箱认证
  3. GeoTools深入解析:GeoTools概述
  4. maven-plugin-shade 详解
  5. Cpython源码分析02_Python代码是怎么运行起来的
  6. 视频试看(视频预览观看)一小部分的实例
  7. 诛仙手游服务器正在维护6,诛仙手游6月14号更新维护公告
  8. (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  9. DOCKER部署gitlab-ce中文版或最新英文版
  10. Nginx实现静态网站部署