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

ISBX/apprtc-ios在iOS 13上无视频输出问题求助

修复iOS 13下apprtc-ios前置摄像头视频发送失败问题

我之前碰到过不少开发者在升级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的格式兼容性问题,你可以手动修改这个类的逻辑:

    1. 在startCaptureWithDevice:format:fps:方法中,检查所选AVCaptureDeviceFormat是否支持实时视频捕获(通过format.supportedFrameRateRanges判断);
    2. 确保在切换摄像头时,先停止当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:57:42