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

我可以在SwiftUI中播放SRT协议的视频流吗?

SRT流在SwiftUI中无法用AVPlayer播放的解决思路

该问题的核心原因是苹果原生AVFoundation框架未内置SRT(Secure Reliable Transport)协议支持,AVPlayer仅支持HLS、HTTP渐进式流、本地音视频文件等系统原生兼容的媒体源,无法直接解析srt://开头的流地址,而VLC播放器本身集成了SRT传输和解码栈,因此可以正常播放。

可行的解决思路如下:

  • 方案1:集成VLC官方iOS封装库VLCKit
    这是落地成本最低的方案,VLCKit完整继承了桌面端VLC的所有协议支持能力,原生兼容SRT流,你只需要将VLC的播放器视图封装为SwiftUI可用的UIViewRepresentable(iOS)或NSViewRepresentable(macOS)即可使用。
    参考实现代码:
    import SwiftUI
    import MobileVLCKit
    
    struct VLCVideoView: UIViewRepresentable {
        let streamURL: URL
        
        func makeUIView(context: Context) -> UIView {
            let view = UIView(frame: .zero)
            let player = VLCMediaPlayer()
            player.media = VLCMedia(url: streamURL)
            player.drawable = view
            player.play()
            context.coordinator.player = player
            return view
        }
        
        func updateUIView(_ uiView: UIView, context: Context) {}
        
        func makeCoordinator() -> Coordinator {
            Coordinator()
        }
        
        class Coordinator: NSObject {
            var player: VLCMediaPlayer?
        }
    }
    
    // 页面调用代码
    VLCVideoView(streamURL: URL(string: "srt://192.168.68.101:9000")!)
        .frame(width: 320, height: 180)
    
  • 方案2:本地流转码中转
    如果你不想引入第三方播放库,可以在应用本地启动一个轻量中转服务,拉取SRT流后转封装为AVPlayer支持的HLS或者HTTP流,再用原生VideoPlayer播放。可以用FFmpeg实现转流逻辑,转流逻辑参考:拉取SRT流后不修改编码参数,直接封装为HLS切片,输出到本地HTTP服务端口,之后AVPlayer直接播放本地的HLS地址即可。该方案优势是可复用原生播放能力,缺点是会增加少量流延迟。
  • 方案3:自研SRT传输+解码栈
    如果对延迟、定制化要求较高,可以单独集成开源libsrt库处理SRT协议的流传输,拿到裸H.264/H.265流数据后,调用系统原生VideoToolbox硬解码接口解码,再用Metal或者AVSampleBufferDisplayLayer渲染视频帧。该方案灵活度最高,但是开发成本也最高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:04