如何在 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 格式录制音频?的主要内容,如果未能解决你的问题,请参考以下文章