斯威夫特,展开零运行时错误记录音频

问题描述:

在下面的代码我得到一个运行时错误,你可以在这里看到的这张照片:斯威夫特,展开零运行时错误记录音频

enter image description here

后,我登录到Twitter的这种事,Push记录按钮,并在下一个ViewController中按下Record按钮。我怀疑原因是,不知何故audioRecorder是零,当强制解包使用!在“如果self.audioRecorder!.recording”,代码崩溃。但我不明白为什么audioRecorder应该在这里。你们有什么想法我做错了什么? 这里是完整的代码。 最佳,

import UIKit 
import AVFoundation 

class RecordViewController: UIViewController { 

var audioRecorder : AVAudioRecorder? 

func setUpAudioRecorder() { 
    do { 
     let baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first! 
     let pathComponents = [baseString, "sound.m4a"] 
     let audioURL = NSURL.fileURLWithPathComponents(pathComponents) 

     let session = AVAudioSession.sharedInstance() 
     try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     try session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker) 
     try session.setActive(true) 

     var recordSettings = [String : AnyObject]() 
     recordSettings[AVFormatIDKey] = Int(kAudioFormatMPEG4AAC) 
     recordSettings[AVSampleRateKey] = 44100.0 
     recordSettings[AVNumberOfChannelsKey] = 2 

     self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings) 
     self.audioRecorder!.meteringEnabled = true 
     self.audioRecorder!.prepareToRecord() 
    } catch (_) { 
    } 
} 

@IBOutlet weak var recordButton: UIButton! 
@IBOutlet weak var playButton: UIButton! 
@IBOutlet weak var saveButton: UIBarButtonItem! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.playButton.enabled = false 
    self.saveButton.enabled = false 
} 

@IBAction func cancelTapped(sender: AnyObject) { 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

@IBAction func saveTapped(sender: AnyObject) { 
} 

@IBAction func recordTapped(button: AnyObject) { 
    if self.audioRecorder!.recording { 
     self.audioRecorder!.stop() 
     button.setTitle("Record", forState: UIControlState.Normal) 
    } else { 
     do{ 
     try AVAudioSession.sharedInstance().setActive(true) 
     self.audioRecorder!.record() 
     button.setTitle("Stop Recording", forState: UIControlState.Normal) 
     } catch (_) {} 
     } 
    self.playButton.enabled = true 
} 

@IBAction func playTapped(sender: AnyObject) { 
} 

}

+1

确定'实际上是被称为'recordTapped'前setUpAudioRecorder'? –

哦,孩子,你是艺术Fistman多么正确。我只是在IBOutlet中调用函数,现在它正在工作。非常感谢您的帮助。 这里是工作的代码别人感兴趣:

import UIKit 
import AVFoundation 

class RecordViewController: UIViewController { 

var audioRecorder : AVAudioRecorder? 

func setUpAudioRecorder() { 
    do { 
     let baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first! 
     let pathComponents = [baseString, "sound.m4a"] 
     let audioURL = NSURL.fileURLWithPathComponents(pathComponents) 

     let session = AVAudioSession.sharedInstance() 
     try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     try session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker) 
     try session.setActive(true) 

     var recordSettings = [String : AnyObject]() 
     recordSettings[AVFormatIDKey] = Int(kAudioFormatMPEG4AAC) 
     recordSettings[AVSampleRateKey] = 44100.0 
     recordSettings[AVNumberOfChannelsKey] = 2 

     self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings) 
     self.audioRecorder!.meteringEnabled = true 
     self.audioRecorder!.prepareToRecord() 
    } catch (_) { 
    } 
} 

@IBOutlet weak var recordButton: UIButton! 
@IBOutlet weak var playButton: UIButton! 
@IBOutlet weak var saveButton: UIBarButtonItem! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.playButton.enabled = false 
    self.saveButton.enabled = false 
} 

@IBAction func cancelTapped(sender: AnyObject) { 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

@IBAction func saveTapped(sender: AnyObject) { 
} 

@IBAction func recordTapped(button: AnyObject) { 
    if (self.audioRecorder?.recording == nil || !self.audioRecorder!.recording) { 
     if (self.audioRecorder?.recording == nil) { 
      setUpAudioRecorder() 
     } 
     do { 
      try AVAudioSession.sharedInstance().setActive(true) 
      self.audioRecorder!.record() 
      button.setTitle("Stop Recording", forState: UIControlState.Normal) 
     } catch (_) {} 
    } else { 
     self.audioRecorder!.stop() 
     button.setTitle("Record", forState: UIControlState.Normal) 
    } 
    self.playButton.enabled = true 
} 

@IBAction func playTapped(sender: AnyObject) { 
} 

}