iOS:AVAudioRecorder.prepareToRecord() 失败且没有错误

Posted

技术标签:

【中文标题】iOS:AVAudioRecorder.prepareToRecord() 失败且没有错误【英文标题】:iOS: AVAudioRecorder.prepareToRecord() failing with no error 【发布时间】:2015-11-02 06:45:29 【问题描述】:

prepareToRecord() 在没有明显原因的情况下返回 false。其他类似问题中的解决方案都不适合我。这是我尝试过的:

在创建 AVAudioRecorder 之前立即开始录制会话(成功)。 输出目录存在且可写。 这些 recordSettings 在我的代码的早期版本(现已丢失)中为我工作,但由于某种原因,一般记录已停止。 我一直在使用 OpenEars 进行语音识别,但是当我注意到这个问题时,我将它从构建中删除了。

版本信息:

ios 9.1 XCode 7.1 斯威夫特 2.1

这是我的代码。模拟器和 iPhone 上的输出如下。

func setupRecorder(url : String) -> Promise<Void>? 
    let (doneRecording, recorderAccept, _) = Promise<Void>.pendingPromise()

    let session: AVAudioSession = AVAudioSession.sharedInstance()
    if (session.respondsToSelector("requestRecordPermission:")) 
        AVAudioSession.sharedInstance().requestRecordPermission((granted: Bool)-> Void in
            if granted 
                print("record permission granted")
                do 
                    try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
                    try session.setActive(true)
                    self._setupRecorder(url, recorderAccept: recorderAccept)
                 catch 
                    print(error)
                
             else
                print("record permission not granted")
            
        )
    

    return doneRecording


func _setupRecorder(url: String, recorderAccept: () -> ()) 
    print(url)

    let recordSettings = [AVSampleRateKey : NSNumber(float: Float(44100.0)),
        AVFormatIDKey : Int(kAudioFormatMPEG4AAC),
        AVNumberOfChannelsKey : NSNumber(int: 1),
        AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.High.rawValue))];

    do 
        let soundRecorder = try AVAudioRecorder(URL: NSURL(fileURLWithPath: url), settings: recordSettings)
        soundRecorder.delegate = self
        if !soundRecorder.prepareToRecord() 
            print("prerecord failed")
            return
        
        if !soundRecorder.record() 
            print("record failed")
            return
        
        self.soundRecorder = soundRecorder
        self.recorderAccept = recorderAccept
     catch let error as NSError 
        print("AVAudioRecorder error: \(error.localizedDescription)")
    

iPhone 输出:

record permission granted
file:///var/mobile/Containers/Data/Application/1DC339E6-555F-47AA-8D4F-4A8E1E847919/Library/Caches/iM3xWVKCGr.aac
prerecord failed

模拟器输出:

record permission granted
file:///Users/adrian/Library/Developer/CoreSimulator/Devices/5D035D65-60FA-413E-9CD7-C2C4277EC25F/data/Containers/Data/Application/6DF6374E-3BCF-4BD0-B826-FE1622F134B4/Library/Caches/1ey96W904T.aac
prerecord failed

缓存目录权限:

drwxr-xr-x  53 adrian  admin  1802 Oct 29 14:12 /Users/adrian/Library/Developer/CoreSimulator/Devices/5D035D65-60FA-413E-9CD7-C2C4277EC25F/data/Containers/Data/Application/6DF6374E-3BCF-4BD0-B826-FE1622F134B4/Library/Caches/

我很想听听其他人是否有建议。

【问题讨论】:

以前在模拟器和具有上述设置的设备上都可以进行录制。当我有机会时,我会从头开始构建一个新的录音应用程序。 想通了。谢谢,马特。 【参考方案1】:

这是我的代码中的错误:NSURL(fileURLWithPath: url)。它应该是NSURL(string: url)!——我给了它一个file:// URL,就好像它是一个文件系统路径一样。

与有关此问题的其他问题一致,prepareToRecord() 如果设置不正确,或者在我的情况下,打开文件进行输出时出现问题,则返回 false。

【讨论】:

以上是关于iOS:AVAudioRecorder.prepareToRecord() 失败且没有错误的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别