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

iOS端WebRTC推流Chrome遇SignalEncoderTimedOut问题求助

解决iOS到Chrome WebRTC音视频传输问题

针对你遇到的视频编码器超时、音频有轨道但无声音的问题,结合你的代码和环境信息,我整理了以下排查和修复方案:

一、解决视频编码器超时(SignalEncoderTimedOut)问题

1. 调整摄像头捕获的时机与格式选择

你的代码是在ICE连接成功后才启动摄像头捕获,且直接选取了formats[0],这可能导致两个问题:

  • 编码器来不及初始化就被要求输出数据,引发超时;
  • 默认的第一个格式可能分辨率过高、帧率不兼容,或者像素格式不被WebRTC编码器支持。

修复建议:

  • 提前启动摄像头捕获:将启动捕获的代码移到创建视频轨道之后,而不是等待ICE连接成功。比如在创建vtrk后立即启动捕获;
  • 筛选兼容的摄像头格式:不要直接取第一个格式,而是选择Chrome支持的分辨率和帧率,示例代码如下:
// 筛选合适的摄像头格式
let cam = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)!
let supportedFormats = RTCCameraVideoCapturer.supportedFormats(for: cam)
// 优先选择分辨率适中(如640x480或1280x720)、帧率>=15的格式
let filteredFormats = supportedFormats.filter { format in
    let dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription)
    let fps = format.videoSupportedFrameRateRanges.first?.maxFrameRate ?? 0
    return (dimensions.width == 640 && dimensions.height == 480) && fps >= 15
}
// 取第一个符合条件的格式,或者 fallback 到默认
let selectedFormat = filteredFormats.first ?? supportedFormats[0]
// 启动捕获(移到创建视频轨道后)
self.vcap!.startCapture(with: cam, format: selectedFormat, fps: 15) { err in
    if let error = err {
        print("Capture start error: \(error)")
    }
}

2. 升级GoogleWebRTC版本

你使用的1.1.23260是比较老旧的版本,可能存在iOS 11兼容性问题,尤其是编码器适配方面。建议升级到适配iOS 11的较新稳定版本,比如修复过iOS编码器超时问题的官方release版本。

二、解决Chrome端无音频问题

1. 检查iOS端音频会话配置

WebRTC需要正确的AVAudioSession配置才能正常捕获和传输音频,你的代码中没有看到相关配置,这可能是关键问题。在初始化WebRTC之前添加以下代码:

do {
    try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .voiceChat, options: [.allowBluetooth, .mixWithOthers])
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print("Audio session setup failed: \(error.localizedDescription)")
}

2. 确认Chrome端音频轨道的正确使用

确保Chrome端正确将接收的音频轨道附加到audio元素:

// 示例:Chrome端处理音频轨道
function handleRemoteStream(stream) {
    const audioElement = document.getElementById('remote-audio');
    audioElement.srcObject = stream;
    audioElement.play().catch(err => console.error('Play audio error:', err));
}

同时检查Chrome端是否开启了静音,或者音频元素的音量是否被设置为0。

3. 验证麦克风权限

确认iOS项目的Info.plist中添加了麦克风权限描述:

<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风进行音视频通话</string>

如果没有权限,音频捕获会静默失败。

三、通用排查建议

  • 查看Chrome端的WebRTC日志:打开chrome://webrtc-internals/,查看音频和视频轨道的接收状态、数据包统计,确认是否有音频数据到达;
  • 尝试添加TURN服务器:虽然你已经用了STUN并建立了连接,但某些网络环境下可能需要TURN来确保媒体流传输,可添加公共TURN服务器测试;
  • 检查iOS设备的系统权限:确认摄像头和麦克风权限已在系统设置中开启。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:04:27