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

Swift 4中使用AVPlayerViewController远程播放视频失败求助

排查Swift 4中AVPlayer远程播放视频失败的问题

我来帮你梳理下可能遗漏的配置和步骤,你的代码逻辑框架没问题,但几个细节很容易踩坑:

  • 先修正URL拼写与安全解包:你代码里的http://example.come/...域名明显写错了(应该是example.com),这会直接导致URL解析失败;而且你用了强制解包videoURL!,如果URL无效会直接触发崩溃。建议换成安全的可选绑定写法:

    guard let videoURL = URL(string: "http://example.com/package=07e9a825-7be4-4ce7-8a6ec78b") else {
        print("无效的视频URL,请检查地址")
        return
    }
    let player = AVPlayer(url: videoURL)
    
  • ATS(App Transport Security)配置:iOS默认只允许HTTPS请求,禁止HTTP资源加载。如果你的视频URL是HTTP协议,必须在Info.plist里添加ATS例外配置:

    1. 右键打开Info.plist,选择「Add Row」
    2. 添加App Transport Security Settings(类型为Dictionary)
    3. 在这个字典下添加Allow Arbitrary Loads,设置值为YES(如果是固定域名,更推荐用Exception Domains配置单个域名的例外,安全性更高)
  • 确保AVPlayer就绪后再播放:直接调用play()可能因为视频资源还没加载完成而失败,建议监听AVPlayer的status属性判断播放时机:

    let playerViewController = AVPlayerViewController()
    playerViewController.player = player
    
    // 添加KVO监听播放状态
    var statusObservation: NSKeyValueObservation?
    statusObservation = player.observe(\.status, options: [.new]) { [weak self] player, _ in
        guard let self = self else { return }
        switch player.status {
        case .readyToPlay:
            self.present(playerViewController, animated: true) {
                player.play()
            }
        case .failed:
            print("播放失败:\(player.error?.localizedDescription ?? "未知错误")")
        case .unknown:
            print("正在加载视频资源...")
        @unknown default:
            break
        }
        statusObservation?.invalidate() // 监听完成后销毁
    }
    
  • 确认视频编码兼容性:浏览器能播放的MP4不一定符合AVPlayer的要求,AVPlayer只支持H.264(Baseline/Main/High profile)视频编码和AAC-LC音频编码的MP4文件,你可以用MediaInfo这类工具检查视频的编码格式是否达标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:01