找出AirPlay音频设备是否正在使用的方法,密码受CoreAudio方法保护

时间:2012-12-24 10:41:22

标签: macos core-audio airplay

我目前在我的应用程序中面临AirPlay设备的问题。我使用此topic作为配置airplay设备的示例。但目前找不到任何解决两个问题的方法:

首先,我无法检测airplay设备当前是否正忙,因为它不支持同时输入?我试图在CoreAudio中找到任何属性,但没有任何运气。

我发现的第二个问题是关于启用密码的airplay设备。如果输入了密码,我无法收到任何通知,因此我的应用程序无法对任何事件做出反应

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我不熟悉新的CoreAudio API,所以可能有一种更简单的方法。以下是我去年解决同样问题的方法。

您可以确定设备是否需要使用Bonjour(也称为多播DNS或Zeroconf)的密码。您应该能够将源名称与CoreAudio信息匹配。对于音频AirPlay,您需要检查_raop._tcp设备。以下是终端的工作原理:

首先,发现附近的AirPlay设备(注意在Mountain Lion之前dns-sd命令被称为mDNS):

laurent ~ $ dns-sd -B _raop._tcp
Browsing for _raop._tcp
DATE: ---Tue 15 Jan 2013---
17:37:31.977  ...STARTING...
Timestamp     A/R Flags if Domain                    Service Type              Instance Name
17:37:31.977  Add     2  4 local.                    _raop._tcp.               406C8F53F1DD@iMac de Laurent

然后,获取AirPlay实例的完整记录:

laurent ~ $ dns-sd -L "406C8F53F1DD@iMac de Laurent" _raop._tcp local
Lookup 406C8F53F1DD@iMac de Laurent._raop._tcp.local
DATE: ---Tue 15 Jan 2013---
17:43:47.097  ...STARTING...
17:43:47.098  406C8F53F1DD@iMac\032de\032Laurent._raop._tcp.local. can be reached at iMac-de-Laurent.local.:5000 (interface 4)
 et=0,1 ek=1 ss=16 raAudioFormats=ALAC,L16 tp=UDP pw=false txtvers=1 ramach=iMac12,1 vn=3 md=0,1,2 sv=false sm=false ch=2 sr=44100 rast=afs rastx=iafs cn=0,1

pw=false表示没有密码。这是基本的想法,现在你应该用DNSServiceResolve做同样的事情。

现在,检查设备是否忙于我知道的唯一方法是实际连接到它。在内部,AirPlay使用RTSP,因此您可以发送此请求:

RTSP/1.0 OPTIONS *
# empty line

如果设备回复状态为453,则表示已经流式传输。

您可以查看我的AirPlay RTSP stack以获取更多信息。