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