2015-12-14 99 views
4

我到处搜索过这个,我找不到正确的方法。我成功地以.wav格式录制,但问题是,当我尝试从录制的.wav文件中读取原始数据时,有些块位于错误的位置/根本就没有。如何在Swift中以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')的在很多个零后,随机点 no 64617461 ('d' 'a' 't' 'a') enter image description here

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

非常感谢,并为这么多的图像抱歉。

+0

你可以添加一个链接到一个坏的wav文件? –

+0

@RhythmicFistman https://www.dropbox.com/s/n1fdsu7n2exjr1t/pg-proj-snimak.wav?dl=0这只是一个随机的例子,我记录的每一个wav都有同样的问题 – Uros19

+0

那个wav没什么错 - 听起来你的解析器有问题。你如何解析它们? –

回答

2

我认为只有fmt大块保证是第一位的。看起来在data区块之前有其他区块可以,所以只需跳过非data区块即可。

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

甲RIFF文件开始时与文件头,后跟数据块的序列。

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

+0

好吧,我会对wav块做更多的研究,看看我能做些什么:)感谢您的帮助 – Uros19

+0

好吧,刚刚做了一个更深入的研究,我发现苹果在中间添加了FLLR子块fmt和数据块。 464c4c52我得到的实际上是'F''L''L''R'从十六进制转换为ascii。 – Uros19