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

Swift 4/Xcode 9从URL播放视频报错:AVF context unavailable for sharedAudioPresentationContext

解决AVPlayer播放时的"AVF context unavailable for sharedAudioPresentationContext"错误

嘿,这个错误我太熟悉了!它通常是因为音频会话没有正确配置,或者你没有给AVPlayer提供一个合法的播放UI上下文导致的。你的代码目前只创建了AVPlayer实例,但没完成后续的呈现步骤,这就是问题所在。下面是具体的修复方案:

1. 完整实现播放器的呈现逻辑

你需要用AVPlayerViewController来托管你的AVPlayer,这样系统才能提供正确的音频/视频播放上下文。修改你的playTrailer函数,完整代码如下:

import UIKit
import AVKit
import AVFoundation

class MovieDetailViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 提前配置音频会话,避免播放时的上下文问题
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
            try AVAudioSession.sharedInstance().activate()
        } catch {
            print("音频会话配置失败:\(error.localizedDescription)")
        }
    }
    
    @IBAction func playTrailer(_ sender: Any) {
        guard let videoURL = URL(string: "http://caribbeancinemas.com/img/trailers/6134.mp4") else {
            print("无效的视频URL,请检查链接是否正确")
            return
        }
        
        // 创建播放器和对应的视图控制器
        let player = AVPlayer(url: videoURL)
        let playerViewController = AVPlayerViewController()
        playerViewController.player = player
        
        // 模态呈现播放器页面,完成后自动开始播放
        present(playerViewController, animated: true) {
            player.play()
        }
    }
}

2. 额外的排查要点

如果上面的代码还是报错,可以检查这几点:

  • 确认你的设备能访问这个视频URL:可以先用浏览器打开链接测试是否能正常加载。
  • 如果需要后台播放音频,在Info.plist里添加UIBackgroundModes键,把audio加入到数组中。
  • 确保所有媒体相关操作都在主线程执行,AVPlayer和AVPlayerViewController的初始化、呈现都不能放在后台线程。

这样修改后,系统就能正确分配音频播放的上下文,那个错误应该就消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:31:21