2015-06-24 2 views
4

Я пытаюсь сделать простой диктофон. Я использую Xcode-бета 7, и я основал свой код из этих трех источников.Использование AVAudioRecorder для записи голоса

Я использую следующий код:

var recordSettings = [ 
     AVFormatIDKey: kAudioFormatAppleIMA4, 
     AVLinearPCMIsBigEndianKey: 0, 
     AVLinearPCMIsFloatKey: 0, 
     AVNumberOfChannelsKey: 2, 
     AVSampleRateKey: 32000 
    ] 

    var session = AVAudioSession.sharedInstance() 

    do{ 
     try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     recorder = AVAudioRecorder(URL: filePath, settings: recordSettings, error: nil) 
    }catch{ 
     print("Error") 
    } 

, но он говорит, что «не удается найти инициализатор для типа„AVAudioRecorder“, который принимает Список аргументов типа '(URL: NSURL ?, настройки: [String: AudioFormatID], ошибка: nil)' "

Не являются ли мои данные именно тем, что требует документация?

+0

Я имея эту ТОЧНУЮ ту же проблему прямо сейчас! Когда я создаю словарь recordSettings, я получаю сообщение об ошибке «AudioFormatID не соответствует протоколу AnyObject». У вас тоже есть эта проблема? – hundley

+0

, потому что вы передаете Int, а не объект. Попробуйте создать NSNumber, как показано в моем ответе: NSNumber (integer: kAudioFormatAppleIMA4) –

ответ

2

AVAudioRecorder не нужно больше параметр ошибки:

init(URL url: NSURL, settings settings: [String : AnyObject]) throws 

Кроме того, мне нужно было разворачивать Filepath, как это было предложено в предыдущем ответе:

func recordSound(){ 
    let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 

    let recordingName = "my_audio.wav" 
    let pathArray = [dirPath, recordingName] 
    let filePath = NSURL.fileURLWithPathComponents(pathArray) 
    let recordSettings = [AVEncoderAudioQualityKey: AVAudioQuality.Min.rawValue, 
      AVEncoderBitRateKey: 16, 
      AVNumberOfChannelsKey: 2, 
      AVSampleRateKey: 44100.0] 
    print(filePath) 

    let session = AVAudioSession.sharedInstance() 
    do { 
     try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     audioRecorder = try AVAudioRecorder(URL: filePath!, settings: recordSettings as! [String : AnyObject]) 
    } catch _ { 
     print("Error") 
    } 

    audioRecorder.delegate = self 
    audioRecorder.meteringEnabled = true 
    audioRecorder.prepareToRecord() 
    audioRecorder.record() 
} 
+0

Хорошо, это делает мое создание успешным, но я еще не тестировал фактическую запись. Также я переместил этот сегмент кода из viewDidLoad в действие для кнопки записи. У вас есть какие-то идеи, почему это могло бы не работать в viewDidLoad? Я думал, что имеет смысл поставить его там, потому что вы хотите, чтобы все было загружено, прежде чем вы нажмете кнопку записи. – seongju

+0

Имеет смысл переместить его в viewDidLoad, но оставить последние две строки для кнопки записи. –

+0

Что делает audioRecorder.delegate = self do? потому что, если я включу это, я не могу заставить его скомпилировать. Когда я запускаю его без этого, я получаю Thread1: EXC_BAD_ACCESS (code = 1, address0x0) – seongju

0

Ваша файловая панель завернута как опция. Вы должны проверить, если не ноль и разворачивать его так:

recorder = AVAudioRecorder(URL: filePath!, settings: recordSettings, error: nil) 

И вам нужно передать указатель NSError тоже:

var error: NSError? 
recorder = AVAudioRecorder(URL: filePath!, settings: recordSettings, error: &error) 

После этого, если у вас есть ошибка в настройках dictionnay, попробуйте преобразовать все Tnt в NSNumber, потому что NSNumber - это Object, а не Int. Пример:

NSNumber(integer: kAudioFormatAppleIMA4) 
+0

С вашим предложением NSNumber он по-прежнему дает аналогичную ошибку: «AudioFormatID» не конвертируется в «Int». EDIT: просто дайте «unsignedInt» вместо «integer» и, похоже, сработает. AudioFormatID - это UInt32. – hundley

Смежные вопросы