Swift Xcode中如何从RPSystemBroadcastPicker获取录屏CMSampleBuffer
录屏获取CMSampleBuffer解决方案
RPSystemBroadcastPickerView本身仅作为系统录屏功能的触发入口控件,不提供录屏数据流的回调能力,你需要配合Broadcast Upload Extension实现CMSampleBuffer的获取,具体实现步骤如下:
1. 新建Broadcast Upload Extension扩展
- 打开Xcode主项目配置页,点击Targets列表左下角的
+按钮,选择Broadcast Upload Extension模板创建新的扩展Target,不需要自定义录屏UI的话不要勾选「Include UI Extension」选项 - 创建完成后系统会自动生成
SampleHandler.swift文件,该类为接收录屏数据流的核心类
2. 实现SampleHandler回调获取CMSampleBuffer
SampleHandler继承自RPBroadcastSampleHandler,录屏启动后系统会通过该类的对应方法回调音视频帧数据,你可以在回调中直接获取CMSampleBuffer:
import ReplayKit class SampleHandler: RPBroadcastSampleHandler { override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) { // 录屏启动后的初始化逻辑 } override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { switch sampleBufferType { case .video: // 此处即可获取到视频帧对应的CMSampleBuffer case .audioApp: // 应用内产生的音频帧CMSampleBuffer break case .audioMic: // 麦克风录入的音频帧CMSampleBuffer break @unknown default: break } } override func broadcastFinished() { // 录屏结束后的清理逻辑 } override func broadcastAnnotated(withError error: Error) { // 录屏异常报错处理 } }
3. 实现扩展与主App的跨进程数据传输
Broadcast Upload Extension是独立运行的进程,和主App不共享内存空间,你拿到的CMSampleBuffer无法直接传递给主App,需要通过跨进程通信方案传输:
- 优先使用
CFMessagePort或App Group共享内存实现低延迟数据传输 - CMSampleBuffer无法直接序列化传递,建议先将CMSampleBuffer编码为H.264/HEVC裸流数据后再传递给主App,主App解码后即可使用
4. 配置RPSystemBroadcastPickerView指定扩展
为了避免用户点击录屏按钮后手动选择扩展,你可以给RPSystemBroadcastPickerView指定你创建的扩展的Bundle ID:
// 替换为你自己创建的Broadcast Upload Extension的Bundle ID picker.preferredExtension = "com.your.own.app.broadcast.extension"
注意事项
- 主App和Broadcast Upload Extension都需要开启
App Groups能力,且配置同一个Group ID用于跨进程通信 - 该方案仅支持iOS 12及以上系统
- 录屏的原始帧率、分辨率由系统控制,你可以在拿到CMSampleBuffer后自行做裁剪、缩放等二次处理
内容的提问来源于stack exchange,提问作者Oscar Junius
相关产品推荐
相关产品推荐

