Swift接入AgoraKit开发音频通话时本地录音文件为空问题求助
排查解决步骤
检查音频权限配置
确认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后缀,不要混用。
- 若使用的Agora SDK版本低于3.5.0,
修正停止录音逻辑
不要在调用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

