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

AVPlayer无法播放.ts视频流,VLC可正常播放求解决方案

解决SwiftUI中AVPlayer无法播放.ts文件的问题

以下是针对你的问题的几个排查和解决方向:

1. 检查App Transport Security(ATS)配置

你的视频URL是HTTP协议,iOS默认ATS会阻止非HTTPS的网络请求。需要在Info.plist中添加相关配置:

  • 方式一(全局允许,适合测试):
    添加NSAppTransportSecurity字典,设置NSAllowsArbitraryLoads为YES
  • 方式二(针对特定域名,更安全):
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>gotoplucky.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>
    

2. 改用AVAsset+AVPlayerItem并监听错误

直接用AVPlayer(url:)初始化可能无法捕获详细错误,换成AVAsset的方式并监听播放状态:

struct VideoPlayerView: UIViewControllerRepresentable {
    let url: URL
    
    func makeUIViewController(context: Context) -> AVPlayerViewController {
        let playerVC = AVPlayerViewController()
        let asset = AVAsset(url: url)
        let playerItem = AVPlayerItem(asset: asset)
        
        // 添加状态监听
        playerItem.addObserver(context.coordinator, forKeyPath: "status", options: .new, context: nil)
        
        let player = AVPlayer(playerItem: playerItem)
        playerVC.player = player
        return playerVC
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject {
        let parent: VideoPlayerView
        
        init(_ parent: VideoPlayerView) {
            self.parent = parent
        }
        
        override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            guard let playerItem = object as? AVPlayerItem, keyPath == "status" else {
                super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
                return
            }
            
            switch playerItem.status {
            case .failed:
                print("播放失败:\(playerItem.error?.localizedDescription ?? "未知错误")")
            case .readyToPlay:
                playerItem.play()
            case .unknown:
                print("资源状态待确认")
            @unknown default: break
            }
        }
    }
    
    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {}
}

3. 验证服务器返回的Content-Type

AVPlayer对媒体类型的识别依赖HTTP响应头的Content-Type,正确的TS文件类型应为video/mp2t。可以用curl命令检查:

curl -I http://alibaba.gotoplucky.com:23000/live/Damianomaca/EfYpS6xSVy/26060.ts

如果返回的Content-Type不是video/mp2t,需要修改服务器配置;或者通过AVAssetResourceLoader在客户端修改响应头(实现较复杂)。

4. 确认TS流的编码兼容性

AVPlayer仅支持特定编码格式:视频需为H.264/H.265,音频需为AAC/MP3等。可以用ffmpeg查看编码信息:

ffmpeg -i http://alibaba.gotoplucky.com:23000/live/Damianomaca/EfYpS6xSVy/26060.ts

如果编码不在AVPlayer支持范围内,需要转码或更换流源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:33:17