ISBX/apprtc-ios在iOS 13上无视频输出问题求助
我之前碰到过不少开发者在升级iOS13后遇到apprtc-ios的前置摄像头问题,结合iOS13对AVFoundation框架的行为变更,给你整理几个针对性的修复方向:
优先检查AVCaptureSession的线程与配置逻辑
iOS13对AVCaptureSession的线程安全性要求更严格了,旧版本apprtc可能在非指定队列中操作session导致捕获失败。你需要确保session的启动、输入输出添加都在专门的捕获队列(或主线程)执行:dispatch_queue_t captureQueue = dispatch_queue_create("com.yourapp.capture", DISPATCH_QUEUE_SERIAL); dispatch_async(captureQueue, ^{ [self.captureSession startRunning]; });另外,iOS13推荐使用
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange作为视频输出的像素格式,旧的格式可能不再兼容,检查apprtc的视频输出配置是否更新了这一点。修复前置摄像头的设备枚举逻辑
iOS13改变了摄像头设备的枚举规则,旧代码靠position属性筛选前置摄像头可能失效,建议改用AVCaptureDeviceDiscoverySession来精准获取前置摄像头:AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionFront]; AVCaptureDevice *frontCamera = discoverySession.devices.firstObject; if (frontCamera && frontCamera.isConnected) { self.selectedCameraID = frontCamera.uniqueID; }这里一定要加上
isConnected判断,iOS13下部分场景会出现设备存在但未连接的情况,导致后续捕获失败。适配apprtc内部的RTCCameraVideoCapturer类
旧版本的RTCCameraVideoCapturer可能没处理iOS13的格式兼容性问题,你可以手动修改这个类的逻辑:- 在
startCaptureWithDevice:format:fps:方法中,检查所选AVCaptureDeviceFormat是否支持实时视频捕获(通过format.supportedFrameRateRanges判断); - 确保在切换摄像头时,先停止当前session再重新配置,避免iOS13下的session状态冲突。
- 在
验证视频编码与传输链路
虽然音频正常,但视频编码环节可能在iOS13下出问题。检查apprtc的视频编码器配置,确保使用H.264 Baseline Profile这类iOS13完全支持的编码规格,同时确认捕获的视频帧数据正确传递给了RTCPeerConnection,没有出现格式不匹配或数据丢失。再次确认摄像头权限的实际状态
即使你看到权限已开启,iOS13下的权限检查也需要更严谨。可以在初始化摄像头前添加实时校验:AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (status == AVAuthorizationStatusAuthorized) { // 继续初始化流程 } else if (status == AVAuthorizationStatusNotDetermined) { [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { if (granted) { dispatch_async(dispatch_get_main_queue(), ^{ // 用户授权后重新初始化摄像头 }); } }]; }另外务必确认Info.plist中的
NSCameraUsageDescription和NSMicrophoneUsageDescription描述清晰,iOS13对权限提示的合规性要求更高,不合规可能导致系统静默限制摄像头使用。
按照这个顺序排查,大概率能解决你的问题,尤其是线程配置和设备枚举这两点,是iOS13适配中最容易踩的坑。
内容的提问来源于stack exchange,提问作者Sunil Kumar Yadav

