【问题标题】:Audio Output Routes for AirPlayAirPlay 的音频输出路径
【发布时间】:2011-12-04 22:27:21
【问题描述】:

我已经查看但找不到访问音频输出路由的方法,因此我可以检测音频是否通过 AirPlay 输出。

这是我在 iOS 5.0 文档中找到的

kAudioSessionOutputRoute_AirPlay

讨论

这些字符串用作与 kAudioSession_AudioRouteKey_Outputs 数组关联的字典的 kAudioSession_AudioRouteKey_Type 键的值。

我找不到访问 kAudioSession_AudioRouteKey_Outputs 数组的方法。

谢谢

【问题讨论】:

    标签: ios audio ios5 audiotoolbox


    【解决方案1】:

    即使 Bassem 似乎找到了解决方案,为了完整起见,以下是如何检测当前输出路由是否为 AirPlay:

    - (BOOL)isAirPlayActive{
        CFDictionaryRef currentRouteDescriptionDictionary = nil;
        UInt32 dataSize = sizeof(currentRouteDescriptionDictionary);
        AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &currentRouteDescriptionDictionary);
        if (currentRouteDescriptionDictionary) {
            CFArrayRef outputs = CFDictionaryGetValue(currentRouteDescriptionDictionary, kAudioSession_AudioRouteKey_Outputs);
            if (outputs) {
                if(CFArrayGetCount(outputs) > 0) {
                    CFDictionaryRef currentOutput = CFArrayGetValueAtIndex(outputs, 0);
                    CFStringRef outputType = CFDictionaryGetValue(currentOutput, kAudioSession_AudioRouteKey_Type);
                    return (CFStringCompare(outputType, kAudioSessionOutputRoute_AirPlay, 0) == kCFCompareEqualTo);
                }
            }
        }
    
        return NO;
    }
    

    请记住,您必须#import <AudioToolbox/AudioToolbox.h> 并链接到 AudioToolbox 框架。

    【讨论】:

      【解决方案2】:

      从 iOS 6 开始,推荐的方法是使用 AVAudioSession(基于 C 的 AudioSession API 自 iOS 7 起已弃用)。

      let currentRoute = AVAudioSession.sharedInstance().currentRoute
      

      currentRoute 返回一个AVAudioSessionRouteDescription,这是一个非常简单的类,具有两个属性:inputsoutputs。其中每一个都是AVAudioSessionPortDescriptions 的可选数组,它提供了我们需要的有关当前路线的信息:

      if let outputs = currentRoute?.outputs as? [AVAudioSessionPortDescription] {
          // Usually, there will be just one output port (or none), but let's play it safe...
          if let airplayOutputs = outputs.filter { $0.portType == AVAudioSessionPortAirPlay } where !airplayOutputs.isEmpty {
              // Connected to airplay output...
          } else {
              // Not connected to airplay output...
          }
      }
      

      portType 是这里的有用信息...请参阅 AVAudioSessionPortDescription docs 了解描述每个输入/输出端口类型的 AVAudioSessionPort... 常量,例如线路输入/输出、内置扬声器、蓝牙 LE、耳机麦克风等

      另外,不要忘记订阅AVAudioSessionRouteChangeNotification,以响应路由更改。

      【讨论】:

      • 你能解释一下在什么情况下输出数组是非零但为空的?
      【解决方案3】:
      CFArray *destinations;
      CFNumber *currentDest;
      
      // Get the output destination list
      AudioSessionGetProperty(kAudioSessionProperty_OutputDestinations, nil, destinations);
      
      // Get the index of the current destination (in the list above)
      AudioSessionGetProperty(kAudioSessionProperty_OutputDestination, nil, currentDest);
      

      我不太确定确切的语法,所以你必须稍微弄乱一下,但你应该了解大致的概念。

      【讨论】:

      • kAudioSessionProperty_OutputDestinations >一个 CFArrayRef 对象,其中包含有关通过 iPad 相机连接套件连接的 USB 音频附件中可用音频输出目标的详细信息。数组的每个元素都包含一个 CFDictionaryRef 对象,其中包含“USB 附件音频目标字典键”中描述的键和相应值。我不能使用它,因为它只用于连接 USB 的设备。
      • 我想出了如何从设备中输出音频,但还不能回答我自己的问题,因为我是菜鸟并且没有 100 多个代表。我将在 5 小时内发布答案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多