我可以在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
相关产品推荐
相关产品推荐

