使用 AVAudioRecorder 录音上传 .WAV 文件遇到的问题

1.把.wav格式的录音文件解析为十六进制的文件
对应的软件: 软件地址
问题: 上传到某飞平台后, 一直报错: 音频声道数只能为1,当前音频的声道数据为0
对应的录制代码:


// 录音的状态
enum ADAudioiRecordState: Int {
    case recording               // 录音中
    case nomal                   // 默认
    case startRecord             // 开始录音
    case stopRecord              // 停止录音
}

// 录音manager
class ADAudioRecordManager: NSObject{

    var audioRecorder : AVAudioRecorder!
    private let audioSession = AVAudioSession.sharedInstance()
    private var timer: Timer?
    public var volumeLevelCallback: ((_ volumeLevel: Int) -> Void)?
    public var recordStateCallback: ((_ recordState: ADAudioiRecordState) -> Void)?
    public var recordPathUrl: URL?
    public static let shared: ADAudioRecordManager = {
        return ADAudioRecordManager()
    }()
    
    
    // 初始化录音配置, 申请录音权限
    func initRecord(pathUrl: URL? = nil){
        
        recordPathUrl = pathUrl
        if recordPathUrl == nil {
            recordPathUrl = recordPath()
        }
        
        // 设置录音配置
               let recordSettings: [String: Any] = [
                AVFormatIDKey: Int(kAudioFormatLinearPCM),
                AVSampleRateKey: 16000.0,
                AVNumberOfChannelsKey: 1,
                AVLinearPCMBitDepthKey: 16,
                AVAudioFileTypeKey:kAudioFileWAVEType, //(刚开始没有配置该参数)
               ]
        do {
            try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
            try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
            try audioRecorder = AVAudioRecorder.init(url: recordPathUrl!, settings: recordSettings)
            audioRecorder.isMeteringEnabled = true
            audioRecorder.prepareToRecord()
            audioRecorder.delegate = self
        } catch { }
    }
    
    // 录音
    func record() {
        if !audioRecorder.isRecording {
            startRecord()
        } else {
            stopRecord()
        }
    }
    
    
    // 开始录音
    func startRecord(){
        if !audioRecorder.isRecording {
            do {
                recordStateCallback?(.startRecord)
                // 停止其他录音
                try audioSession.setActive(true, options: AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
                audioRecorder.record()
            }
            catch _ as NSError { }
            recordStateCallback?(.recording)
            timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { [weak self] _ in
                guard let self = self else { return }
                self.audioRecorder.updateMeters()
                let averagePower = self.audioRecorder.averagePower(forChannel: 0)
                let volumeLevel = max(0, min(4, Int((averagePower + 60) / 15)))
                self.volumeLevelCallback?(volumeLevel)
            }
        } else {
            stopRecord()
        }
    }
    
    // 停止录音
    func stopRecord(){
        if audioRecorder.isRecording {
            audioRecorder.stop()
            do {
                // 通知其他播放源可以继续播放了
                try audioSession.setActive(false, options: AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
            } catch { }
            recordStateCallback?(.stopRecord)
        }
        timer?.invalidate()
    }
    
    // 删除录音的本地路径
    func deleteRecording() -> Bool {
        let fileManager = FileManager.default
        // 尝试删除文件
        var isDelete: Bool = fileManager.isDeletableFile(atPath: recordPathUrl?.pathExtension ?? "")
        print("文件已删除")
        return isDelete
    }
    // 获取录音的路径
    func recordPath() -> URL{
        let currentDateTime = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "ddMMyyyyHHmmss"
        let recordingName = formatter.string(from: currentDateTime)+".wav"
        
        let fileManager = FileManager.default
        let urls = fileManager.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
        let documentDirectory = urls[0] as URL
        let soundURL = documentDirectory.appendingPathComponent(recordingName)
        return soundURL
    }
}
// MARK: - AVAudioRecorderDelegate
extension ADAudioRecordManager: AVAudioRecorderDelegate{
    
        func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
            if flag {
                print("录音成功")
            } else {
                print("录音失败")
            }
        }
        func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) {
            print("录音编码错误: \(error?.localizedDescription ?? "未知错误")")
        }
}

某飞那边给了错误原因:


WX20241202-150904@2x.png

按照这个思路进行修改配置:
肯定是配置的问题:
AVAudioFileTypeKey:kAudioFileWAVEType, //(刚开始没有配置该参数)
找到这个参数, 进行配置后, 即可上传成功

从网上也了解到wav格式解析后的一些参数:
https://blog.51cto.com/u_16213652/12073124

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容