如何在 Swift 中以 wav 格式录制音频?

Posted

技术标签:

【中文标题】如何在 Swift 中以 wav 格式录制音频?【英文标题】:How to record audio in wav format in Swift? 【发布时间】:2015-12-14 20:01:45 【问题描述】:

我到处寻找这个,我找不到正确的方法。我已经成功地以 .wav 格式录制,但问题是,当我尝试从录制的 .wav 文件中读取原始数据时,有些块在错误的位置/根本不存在。

我的录音代码:

    func startRecording()

    let audiosession = AVAudioSession.sharedInstance()

    try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    try! audioSession.setActive(true)
    audioSession.requestRecordPermission((allowed: Bool) -> Void in print("Accepted") )


    let settings: [String : AnyObject] = [
        AVFormatIDKey:Int(kAudioFormatLinearPCM),
        AVSampleRateKey:44100.0,
        AVNumberOfChannelsKey:1,
        AVLinearPCMBitDepthKey:8,
        AVLinearPCMIsFloatKey:false,
        AVLinearPCMIsBigEndianKey:false,
        AVEncoderAudioQualityKey:AVAudioQuality.Max.rawValue
    ]

    let date = NSDate()

    let df = NSDateFormatter()
    df.dateFormat = "yyyy-MM-dd-HH:mm:ss"

    let dfString = df.stringFromDate(date)

    let fullPath = documentsPath.stringByAppendingString("/\(dfString).wav")

    recorder = try! AVAudioRecorder(URL: NSURL(string: fullPath)!, settings: settings)
    recorder.delegate = self
    recorder.prepareToRecord()
    recorder.record()


当我打印出录音机音频文件的数据时,我得到一个奇怪的数字,应该写 'd' 'a' 't' 'a',后面跟着零。然后,在数据中间出现。

没有 64617461 ('d' 'a' 't' 'a') 块 - 它应该代替 464c4c52

64617461 ('d' 'a' 't' 'a') 在很多零之后的随机点

有没有更好的方式来录制 wav 文件?我不确定为什么会发生这种情况,所以任何帮助将不胜感激。我是否应该以其他格式记录然后将其转换为原始格式?

感谢和抱歉这么多图片。

【问题讨论】:

你能添加一个指向坏 wav 文件的链接吗? @RhythmicFistman dropbox.com/s/n1fdsu7n2exjr1t/pg-proj-snimak.wav?dl=0 这只是一个随机的例子,每个 wav 我录制的都有同样的问题 那个 wav 没有问题 - 听起来你的解析器有问题。你是如何解析它们的? @RhythmicFistman 我在解析之前打印,我打印的只是文件的原始 NSData,在读取实际块之前。我为从网上下载的一些 wav 文件打印了相同的数据,并且按预期打印。 为我工作。谢谢 【参考方案1】:

我认为只有fmt 块才能保证排在第一位。看起来在data 块之前有其他块很好,所以跳过非data 块。

来自http://soundfile.sapp.org/doc/WaveFormat/

RIFF 文件以文件头开头,后跟一系列数据块。

你需要更新你的解析器:)

【讨论】:

好吧,我会做更多关于 wav 块的研究,看看我能做什么 :) 谢谢你的帮助 好吧刚刚做了更深入的研究,我发现Apple在fmt和数据块之间添加了FLLR子块。我得到的 464c4c52 实际上是 'F' 'L' 'L' 'R' 从十六进制转换为 ascii。 那么实际的解决方案是什么? 你有什么问题?如果您只想在 iOS 上阅读 wav,请尝试 AVAudioFile

以上是关于如何在 Swift 中以 wav 格式录制音频?的主要内容,如果未能解决你的问题,请参考以下文章

如何把matlab里的音频文件转换为wav格式

在android中使用MIC以mp3格式录制音频

Flutter Web项目如何录制wav格式音频

使用如何在 iPhone 中以 mp3 格式录制声音的音频队列服务示例

如何将base64音频数据解码为wav格式

错误的 .wav 格式录制音频 NAudio 库