You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

watchOS独立播放HLS直播音频故障求助

Apple Watch独立播放HLS直播音频问题解决

问题场景

需要实现Apple Watch脱离配对手机独立播放HLS直播音频,目前手机在场时可正常启动流播放,但手机不在附近时,watchOS无法独立触发播放(目标是实现类似Spotify或Apple Music的独立播放能力)。已学习2019年WWDC流媒体相关内容及watchOS后台音频官方文档,开启了后台音频模式,但调用路由选择器选择AirPods等输出设备后,音频流并未启动。

现有排查信息

运行日志

  • [Routing] Presenting route picker alert for audioSessionID: 401593
  • AVAudioSession激活成功(success变量为true)
  • 无错误返回(error变量为nil)
  • 目标流地址:https://listen.powerapp.com.tr/powerfm/abr/playlist.m3u8

当前核心代码

do {
try  AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, policy: .longFormAudio, options: [])
}
catch {
print("no audiosession!")
}

AVAudioSession.sharedInstance().activate(options: []) { success, error in
dump(success)
dump(error)
DispatchQueue.main.async {
if let streamURL = moduleItem.media?[0] as? String {
dump(streamURL)
let asset  = AVURLAsset(url: URL(string: streamURL)!, options: nil)
let item = AVPlayerItem(asset: asset)
let player = AVQueuePlayer(playerItem: item)
player.play()
}
}
}

针对性解决方案

1. 修复播放器生命周期问题

当前代码中AVQueuePlayer是回调内的局部变量,回调执行完毕后会被系统回收,导致播放无法持续。必须将播放器声明为类属性或全局变量,确保其生命周期覆盖整个播放过程:

// 在类内部声明播放器属性
private var player: AVQueuePlayer?

// 初始化播放逻辑时赋值
self.player = AVQueuePlayer(playerItem: item)
self.player?.play()

2. 适配watchOS的HLS流格式

部分HLS流可能包含watchOS不支持的音频编码,建议优先使用AAC-LC编码。可通过以下代码检查流的兼容性:

asset.loadTracks(withMediaType: .audio) { tracks, error in
    guard let audioTrack = tracks?.first else { return }
    let formatDesc = audioTrack.formatDescriptions.first as! CMFormatDescription
    let mediaSubtype = CMFormatDescriptionGetMediaSubType(formatDesc)
    print("当前音频编码:\(mediaSubtype)")
    // 验证是否为watchOS支持的编码(如kAudioFormatMPEG4AAC)
}

3. 完善后台音频配置

除代码中的音频会话设置,还需确认:

  • 在watchOS应用的Info.plist中添加UIBackgroundModes数组,包含audio字段
  • 若直播场景下longFormAudio策略适配不佳,可尝试简化音频会话配置:
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowAirPlay])
    

4. 监听路由切换并触发播放

路由选择完成后,需主动重新触发播放逻辑。可通过监听音频路由变更通知实现:

// 在初始化方法中添加监听
NotificationCenter.default.addObserver(
    self,
    selector: #selector(handleAudioRouteChange),
    name: AVAudioSession.routeChangeNotification,
    object: nil
)

// 实现通知处理方法
@objc private func handleAudioRouteChange(notification: Notification) {
    guard let player = self.player, !player.isPlaying else { return }
    player.play()
}

5. 确保watchOS独立联网权限

若依赖蜂窝网络播放,需在watchOS应用的权限设置中开启蜂窝数据权限,同时确认Info.plist中的ATS配置允许目标流地址的网络请求。


内容的提问来源于stack exchange,提问作者Baris Yazganc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:33:43