2015-11-02 1 views
0

prepareToRecord() возвращает false без видимых причин. Ни одно из решений других подобных вопросов не работало для меня. Вот что я пробовал:iOS: AVAudioRecorder.prepareToRecord() с ошибкой без ошибок

  • Запуск сеанса записи (успешно) непосредственно перед созданием AVAudioRecorder.
  • Выходной каталог существует и доступен для записи.
  • Эти recordSettings работали для меня в (теперь утерянной) более ранней версии моего кода, но запись вообще остановилась по какой-то причине.
  • Я использовал OpenEars для распознавания речи, но я удалил его из сборки, когда заметил эту проблему.

Версия информация:

  • IOS 9,1
  • XCode 7.1
  • Swift 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 

Simulator вывода: каталог разрешения

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 

Cache:

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/ 

Я хотел бы услышать, если кто-то есть предложение ,

+0

Запись ранее работала как на тренажере, так и на устройстве с указанными выше настройками. Когда я получу шанс, я с нуля создам новое приложение для записи. – user2683747

+0

Выяснил это. Спасибо, Мэтт. – user2683747

ответ

1

В код есть ошибка: NSURL(fileURLWithPath: url). Он должен быть NSURL(string: url)! - я дал ему URL-адрес file://, как если бы это был путь к файловой системе.

В соответствии с другими вопросами по этой проблеме prepareToRecord() возвращает false, если параметры неверны или, как в моем случае, существует проблема с открытием файла для вывода.