AirPlay Android接收端学习一 协议

2023-05-16

一 AirPlay 接收端描述

AirPlay是苹果的私有协议,苹果官方未开放api和sdk,目前相对权威的一份非官方协议文档。这篇文档详细描述了aiplay 服务发现、图片、音视频、镜像投屏的相关协议,给我们开发airplay设备提供了很好的参考。但是不足之处是文档已经有6年多时间没有更新过,对于IOS的新变化可能没有完全同步。在开发过程中我们可能会面临一些未知的坑,需要针对具体问题来逐一解决。

1.1 Airplay服务发现

Airplay设备启动之后可以发布两类服务:

1.RAOP (Remote Audio Output Protocol),用于音频传输。

2.AirPlay service 用于图片、视频、镜像等媒体的传输。

实现AIRPLAY协议的APP不需要再做任何配置就能发现同一网络中的接收端设备,这主要得益于Bonjour(基于M-DNS协议实现)。Bonjour:苹果为基于组播域名服务(multicast DNS)的开放性Zeroconf标准所起的名字。Zeroconf (零设置网络标准):全称为Zero configuration networking,中文名则为零配置网络服务标准,是一种用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。具体例子为:用户拥有一台apple tv和一台iPhone5s,只要都连入到同一个无线局域网内,iphone4s就会自动找出apple tv,那么在播放音乐或者视频时候,用户只要点击推送,就可以讲音乐和视频推送到apple tv上播放

对于接收端,我们主要关注RAOP服务:

RAOP service from Device Name
name: 5855CA1AE288@Device Name
type: _raop._tcp
port: 49152
txt:
 txtvers=1
 ch=2
 cn=0,1,2,3
 da=true
 et=0,3,5
 md=0,1,2
 pw=false
 sv=false
 sr=44100
 ss=16
 tp=UDP
 vn=65537
 vs=130.14
 am=AppleTV2,1
 sf=0x4

服务名称由设备的mac地址和设备名称组成。

TXT属性包括:

namevaluedescription
txtvers1TXT记录版本
ch2音频通道:立体声
cn0,1,2,3音频编解码格式
et0,3,5支持的加密类型
md0,1,2支持的元数据类型
pwfalse接收端是否需要密码
sr44100音频码率
ss16音频采样率
tpUDP支持的传输层协议
vs130.14服务端版本
amAppleTV2,1设备模式

音频编解码

cn描述
0PCM
1Apple Lossless (ALAC)
2AAC
3AAC ELD (Enhanced Low Delay)

IOS设备作为AirPlay客户端,发送的音频流默认是ALAC格式,安卓设备作为接收端,系统自带的MediaPlayer无法解码ALAC格式,因此需要先使用开源的代码对ALAC格式的音频流进行解码,解码生成PCM数据,最后可以通过AudioTrack来播放PCM流。

加密类型

et描述
0没加密
1RSA (AirPort Express)
3FairPlay
4MFiSAP (3rd-party devices)
5FairPlay SAPv2.5

元数据

md描述
0text 文本
1artwork 插图
2progress 播放进度

总结:

通过RAOP服务发现协议中的描述,可以知道Airplay接收端服务的名称、支持的音频编解码格式、加密类型以及音频播放的进度、插入、歌曲和歌手名称等。这些可以满足我们使用IOS手机或者pad向安卓平台AirPlay接收端同步歌曲的基本需求。

二 音频流传输

音频流传输采用RTSP(Real Time Streaming Protocol)协议 (RFC 2326)。实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。

音频传输协议主要包括:RTSP请求、RTP流、音量控制、元数据、认证、远程控制。

2.1 RTSP请求

OPTIONS请求向RTSP服务端询问它支持的方法,以Apple TV为例,它支持:ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER, POST and GET.当客户端知道服务端支持的方法之后,便可以通过这些方法名向服务器发送数据来实现指定的功能。我们来详细看一下主要的方法描述:

ANNOUNCE

通过SDP(Session Description Protocol)服务描述协议向RTSP服务端发送音频流数据的属性,编解码器和加密密钥等信息。

RECORD

RECORD请求启动音频流传输

FLUSH

FLUSH请求停止音频流传输

TEARDOWN

结束RTSP会话

2.2 RTP流

音频包完全符合RTP协议。控制和定时分组并不完全符合RTP标准。

2.3 音量控制

通过SET_PARAMETER请求可以用来调节音量。音量值是float类型,-144表示静音,音量范围在-30到0之间。

示例

client → server

SET_PARAMETER rtsp://fe80::217:f2ff:fe0f:e0f6/3413821438 RTSP/1.0
CSeq: 6
Session: 1
Content-Type: text/parameters
Content-Length: 20
User-Agent: iTunes/10.6 (Macintosh; Intel Mac OS X 10.7.3) AppleWebKit/535.18.5
Client-Instance: 56B29BB6CB904862
DACP-ID: 56B29BB6CB904862
Active-Remote: 1986535575

volume: -11.123877
serverclient

RTSP/1.0 200 OK
Server: AirTunes/130.14
CSeq: 6

2.4 元数据

SET_PARAMETER请求可以用来传输元数据,元数据内容包括:音频名称、作者名字、专辑名称、插图、音频时长。RTP-Info 头部包含了rtptime参数,表示元数据的有效时间。

2.5 认证

发送的音频数据需要通过RSA认证,所有的二进制数据需要使用Base64 (RFC 4648) 进行加密。

客户端:

  • 在ANNOUNCE 请求中,通过Apple-Challenge 发送128位随机数据。

  • 生成一个128位的AES key,使用RSA公钥加密。

服务端:

  • 使用RSA私钥解密AES key,AES key将被用来解密音频数据

  • 使用RSA私钥对Apple-Challenge进行签名,通过Apple-Response头部发送返回结果给客户端

客户端:

使用RSA公钥对Apple-Response进行解密,检查数字与之前发送的数字是否相同。

2.6 远程控制

airplay服务端可以通过DACP (Digital Audio Control Protocol)协议向客户端发送命令:改变当前播放的音轨状态、暂停、重播,调整播放列表等。airplay客户端通过在RTSP请求中包含DACP-ID头文件来告诉服务端自己支持的命令范围。

总结:

airplay客户端通过向服务端发送OPTIONS请求获取服务端支持的方法列表,随后可以向服务端发送这些命令来建立和结束RTSP会话。客户端发送的音频数据需要RSA认证:首先客户端通过RSA公钥加密128位的AES key,然后服务端通过RSA私钥解密key,随后使用解密后的key来解密音频负荷数据包。客户端可以SET_PARAMETER 请求来调节音量,传输音轨名称、专辑名手、作者名称、音轨播放进度等信息。airplay服务端可以通过DACP发送远程控制命令来实现:改变当前播放的音轨状态、暂停、重播,调整播放列表等。

三 代码参考实现

AirReceiver(https://github.com/fgp/AirReceiver)使用Java写的运行在PC端的AirPlay接收端

DroidAirPlay(https://github.com/pentateu/DroidAirPlay) 基于AirReceiver代码转换成安卓项目的实现代码

AndroidAirPlayReceiver(https://github.com/zhhp1121/AndroidAirPlayReceiver)基于DroidAirPlay改造后能直接使用的安卓工程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AirPlay Android接收端学习一 协议 的相关文章

  • 如何获取之前的碎片?

    为了在我的应用程序中重用某些片段 我需要知道哪个片段是返回堆栈上的第二个片段 为了做到这一点 我正在使用getFragmentManager getFragments 显示以下错误 但有效 FragmentManager getFragme
  • Android webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • 如何强制 Eclipse 将 xml 布局和样式显示为文本?

    我最近升级到带有 ADT 20 0 3 的 Eclipse 4 2 Juno 如果我查看旧项目中的布局或样式 Eclipse 只会向我显示其适当的基于控件的编辑器 我想编辑语法突出显示的 xml 文本 我没有找到将插件的编辑器切换到此模式的
  • 在android中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • Manifest Merger工具:替换失败

    我正在使用一个使用自己的 android theme 的库 因此在构建时收到以下错误 错误 55 9 任务 contacit processDebugManifest 执行失败 清单合并失败 AndroidManifest xml 中的属性
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • Service 和 IntentService,运行从服务器轮询数据库值的服务哪个更好?

    我读过很多关于Service and IntentService 然而 当做出决定时 我没有足够的信心选择使用哪种类型来创建一个后台服务 该服务将在一定时间间隔内从数据库轮询数据 并在获得所需数据时停止它 因为数据代表请求的状态 例如 订购
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • Android 自定义布局 - onDraw() 永远不会被调用

    public class MainActivity extends Activity Override public void onCreate Bundle savedInstanceState super onCreate savedI
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • Android Library项目使用gradle在命令行编译时无法导入另一个库项目的R类

    我的 android 项目有这样的结构 ProjectDir settings gradle MyApp depends on LibraryA and LibraryB gt build gradle gt All the other a
  • android EditText 输入类型用于 StreetNumber 字段

    我试图在地址对话框的 streetNumber 字段中选择正确的 inputType 我想先显示数字键盘 然后让用户输入字母字符 对于一些非常特殊的情况 更接近这个的是 inputType datetime 但这不允许输入字母字符 那么如何
  • Android onChange 事件未在 android 5 (Lollipop) 上的 chrome 历史记录的 contentObserver 中触发

    我注意到我的 chrome 历史记录和书签的 contentObservers 在 android lolipop 上不再触发 该代码在旧版本的 android 上完美运行 无论 chrome 版本如何 但在 Lollipop 上它不再运行
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组
  • 如何在片段中实现 onBackPressed() 和意图?

    我知道 onBackPressed 是活动中的一种方法 但是 我想在片段中使用该功能 以便当按下后退按钮时 它会通过 Intent 重定向到另一个活动 有什么办法解决这个问题吗 public class News Events fragme

随机推荐

  • CentOS8下编译配置nginx+rtmp,搭建推流服务器

    一 环境 服务器操作系统 xff1a CentOS Linux release 8 2 2004 Core nginx 版本 https nginx org download nginx 1 18 0 tar gz RMTP模块 xff1a
  • CentOS7网络配置(ping不同的原因及解决方法)

    这是配置好的CentOS7 xff0c 刚开始在Vmware里装CentOS7后是没有ip的 xff0c 原因是CentOS7默认不启动网卡的 xff0c 网卡不启用还ping个毛 进入 etc sysconfig network scip
  • SpringBoot-JPA进行多表连接查询

    通过JPA进行简单的 内 连接查询 1 准备 1 1开发工具Intellij Idea 1 2数据库mysql 1 3新建Spring Initializr项目 xff0c 勾选web mysql rest jpa依赖 2 开始 2 1项目
  • 响应式导航栏-利用纯css实现

    思路 xff1a 当屏幕为移动设备时 xff0c 隐藏导航栏列表项目 xff0c 显示菜单按钮 给菜单按钮 xff08 电脑时隐藏 xff09 加入hover 或者checked选择器实现 xff0c 当hover或者checked的触发时
  • BTRFS文件系统安装ArchLinux

    layout post title BTRFS文件系统安装ArchLinux date 2017 10 02 categories Linux 主要为以下步骤 xff1a 1 下载ArchLinux安装镜像并 制作U盘启动工具 2 开机进入
  • JSP文件上传

    JSP文件上传 网上的方法几乎都是使用的org apache commons fileupload的jar包 xff0c 需要手动下载导入commons fileupload jar和commons io jar 其实tomcat自带的or
  • ORPALIS PDF Reducer Pro(免费pdf压缩器工具)官方正式版V4.0.1 | pdf免费压缩软下载 | 怎样将pdf压缩得很小?

    ORPALIS PDF Reducer Pro 是一款优秀实用的离线单机版pdf免费压缩软件 xff0c 也就是大家说的免费pdf压缩器工具 xff0c 内置多种超高压缩比的PDF压缩算法和创新的页面布局分析以及自动颜色检测机制 xff0c
  • ubuntu系统文件夹作用

    opt 文件夹 用户级的程序目录 xff0c 可以理解为D Software xff0c opt有可选的意思 xff0c 这里可以用于放置第三方大型软件 xff08 或游戏 xff09 xff0c 当你不需要时 xff0c 直接rm rf掉
  • rhel7安装GUI

    check the rank of starting system systenmctl get default not found startx 查看光盘是否挂载 df 挂载 yum mount dev sr0 mnt mount dev
  • org-mode Properties-and-Columns翻译

    https orgmode org manual Properties and Columns html Properties and Columns 文章目录 属性属性语法特殊属性属性查询属性继承 Column View 列视图定义列列定
  • python利用ffmpeg进行rtmp推流直播

    思路 xff1a opencv读取视频 gt 将视频分割为帧 gt 将每一帧进行需求加工后 gt 将此帧写入pipe管道 gt 利用ffmpeg进行推流直播 pipe管道 xff1a 啥是pipe管道 xff1f 粗略的理解就是一个放共享文
  • 电脑环境PCL配置及VS2019环境配置

    VS2019配置pcl 1 12 0 前言 对于 3D 点云处理来说 xff0c PCL 完全是一个的模块化的现代 C 43 43 模板库 其基于以下第三方库 xff1a Boost Eigen FLANN VTK CUDA OpenNI
  • java算法--兔子繁殖问题

    java算法 兔子繁殖问题 题目 xff1a 古典问题 xff1a 有一对兔子 xff0c 从出生后第 3 个月起每个月都生一对兔子 xff0c 小兔子长到第四 个月后每个月又生一对兔子 xff0c 假如兔子都不死 xff0c 问每个月的兔
  • Linux配置Wifi模块

    linux终端无线网卡连接wifi xff1a 扫描可用连接wifi nmcli dev wifi 添加一个wifi的连接 nmcli dev wifi con 无线网络名称 password 无线网络密码 name 任意连接名称 xff0
  • Paho MQTT 嵌入式c客户端研究笔记

    最近做物联网设备 xff0c 需求长连接推送功能 当前物联网有一个标准协议是MQTT xff0c 对应有很多开源服务端 xff0c 如何快速接入这个服务呢 有两种接入方案 xff1a 1 自己clone 代码修改维护 2 找第三方服务 xf
  • Paho MQTT 嵌入式c客户端研究笔记 (二)

    paho mqtt embedded c master MQTTPacket samples xff0c 这个目录里面封装了发布消息 订阅消息的示例 运行pub0sub1 xff0c 这个示例里面会去订阅主题消息 发布主题消息 并且订阅和发
  • Android App 架构设计

    简介 本文是对谷歌原生文档的翻译 xff0c 仅供学习参照 原文链接 此文档写给希望学习最优编程实践和架构以开发健壮 高质量APP的开发者 开发者常遇到的问题 传统的桌面程序大多数使用场景是有一个启动入口 xff0c 作为一个独立进程运行
  • Linux Ubuntu 18.04 换源

    在安装好Ubuntu后 xff0c 你会发现软件下载安装速度非常慢 xff0c 甚至会出错 xff0c 因为Ubuntu官方的源在国内访问的速度非常慢 xff0c 但是我们可以更改系统的源为国内的一些源来提高速度 xff08 国内各大网站的
  • gradle学习二 利用javassist api修改class字节码

    一 前言 Javassist Java Programming Assistant makes Java bytecode manipulation simple It is a class library for editing byte
  • AirPlay Android接收端学习一 协议

    一 AirPlay 接收端描述 AirPlay是苹果的私有协议 xff0c 苹果官方未开放api和sdk xff0c 目前相对权威的一份非官方协议文档 这篇文档详细描述了aiplay 服务发现 图片 音视频 镜像投屏的相关协议 xff0c