当 allowedExternalPlayback 为 false 时,AVPlayerViewController 通过airplay 播放音频

Tom*_*out 5 avfoundation ios avaudiosession avplayer airplay

我有一个通过 AVPlayerViewController 播放的主视频,应该通过 Airplay 播放到 AppleTV 等。这就是我设置视图控制器的方式:

let player = AVPlayer(url: url)
let controller = AVPlayerViewController()
controller.player = player
Run Code Online (Sandbox Code Playgroud)

这是 AudioSession 的设置:

try session.setCategory(.playback)
try session.setActive(true)
Run Code Online (Sandbox Code Playgroud)

添加了音频、AirPlay 和画中画的后台模式功能。

然后我还有另一个视频,该视频永远不能通过 AirPlay 播放。在实际的应用程序中,当 AVPlayerLayer 中的屏幕被访问时,该视频将自动播放。但为了简单起见,我在本例中使用另一个 AVPlayerViewController。我看过关于 Airplay 2 的 WWDC,他们建议player.allowsExternalPlayback = false针对这些具体情况进行设置。

这就是我设置不应播放 AirPlay 的播放器的方法:

let player = AVPlayer(url: url)
player.allowsExternalPlayback = false

let controller = AVPlayerViewController()
controller.player = player
Run Code Online (Sandbox Code Playgroud)

这种作品。但是,如果您:

  1. 开始与第一个玩家进行播放
  2. 关闭播放器(当播放仍然连接时)
  3. 开始播放第二个播放器(禁用外部播放的播放器)

视频正在设备上播放,但音频正在外部设备上播放。

我尝试过的:

  1. 停用AudioSessiontry session.setActive(false)
  2. try session.setCategory(.playAndRecord, options: [.defaultToSpeaker])
  3. 将类别更改为.playAndRecordsession.overrideOutputAudioPort(.speaker)

没有运气。

我能够将会话更改为multiRoute将与 Airplay 断开连接的类别,但它也会与任何耳机断开连接,并且由于某种原因禁用音量控制。

我还应该补充一点,它会播放音频,而不管player.isMuted = true.

我在这里准备了一个示例项目: https: //github.com/tkohout/AirplayTest。在第三个选项卡上还有一个“设置 VC”,您可以在其中设置“音频会话”设置。

有人遇到类似的问题吗?这是可以解决的还是只是 AirPlay 的一个错误/功能?我正在使用 iOS 15 的设备上进行测试。

非常感谢托马斯·科胡特

Tom*_*out 1

对于面临同样问题的任何人 - 我们找到了部分解决方法。当第二个播放器要自动播放时,我们首先检查airplay是否未连接,代码如下:

var isAirplayActive: Bool {
    let route = AVAudioSession.sharedInstance().currentRoute
    return route.outputs.contains { $0.portType == .airPlay }
}
Run Code Online (Sandbox Code Playgroud)

这样,如果没有用户交互,airplay 播放至少不会开始。