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

Swift接入AgoraKit开发音频通话时本地录音文件为空问题求助

声网AgoraKit iOS端录音文件为空问题解决方案

排查解决步骤

  • 检查音频权限配置
    确认Info.plist中已添加NSMicrophoneUsageDescription权限声明,调用录音接口前先调用AVAudioSession.sharedInstance().requestRecordPermission主动申请麦克风权限,只有权限状态为授权时,SDK才能正常写入音频数据,否则只会创建空文件。

  • 调整录音启动时机
    你当前在joinChannel成功回调中立刻启动录音,此时频道音频链路还未完成初始化,无法采集到音频数据。建议将录音启动逻辑推迟到收到rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int)回调(本地/远端用户成功上麦有音频流输出)之后执行,或加入频道后延迟1-2秒再启动录音。

  • 确认配置参数合法性

    • 若使用的Agora SDK版本低于3.5.0,recordingSampleRate仅支持16000/32000/44100三个取值,不要填写其他数值
    • 确认保存路径后缀与录制格式匹配,aac格式对应.aac后缀,wav格式对应.wav后缀,不要混用。
  • 修正停止录音逻辑
    不要在调用leaveChannel的同时执行stopAudioRecording,要先调用停止录音接口,等待至少100ms再执行离开频道操作,确保SDK有足够时间将缓存的音频数据写入文件并关闭文件句柄。建议监听rtcEngine(_ engine: AgoraRtcEngineKit, audioRecordingStateChanged state: AgoraAudioRecordingState, error: AgoraAudioRecordingError)回调,收到state = .success通知后再访问录音文件。

  • 确认频道内有音频输入
    若频道全程无任何音频输入(本地麦克风未开启、无远端用户发音频流),SDK也会生成空的录音文件,可先测试有持续音频输入的场景下录音是否正常。

修正后代码示例

// 提前申请录音权限
func requestAudioPermission() {
    AVAudioSession.sharedInstance().requestRecordPermission { granted in
        guard granted else {
            print("录音权限被拒绝")
            return
        }
    }
}

func initializeAgoraEngine() {
    agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: AppID, delegate: self)
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let logURL = documentsDirectory.appendingPathComponent("agorasdk.log")
    agoraKit.setLogFile(logURL.path)
}

func joinChannel() {
    agoraKit.joinChannel(byToken: Token, channelId: "demoChannel", info: nil, uid: nil) { [unowned self] (sid, uid, elapsed) -> Void in
        self.agoraKit.setEnableSpeakerphone(true)
        UIApplication.shared.isIdleTimerDisabled = true
    }
}

// 收到用户上麦回调后启动录音
var isRecordingStarted = false
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
    guard !isRecordingStarted else { return }
    isRecordingStarted = true
    
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let audioURL = documentsDirectory.appendingPathComponent("audio.aac")
    
    let config = AgoraAudioRecordingConfiguration()
    config.filePath = audioURL.path
    config.recordingQuality = .medium
    config.recordingPosition = .mixedRecordingAndPlayback
    config.recordingSampleRate = 16000
    let result = agoraKit.startAudioRecording(withConfig: config)
    print("录音启动结果:\(result)")
}

// 停止录音并离开频道
func stopRecordAndLeave() {
    agoraKit.stopAudioRecording()
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        self.agoraKit.leaveChannel(nil)
        UIApplication.shared.isIdleTimerDisabled = false
        self.isRecordingStarted = false
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:57:03