我正在尝试用AVAudioRecorder录制音频然后保存它以便我以后可以使用它.到目前为止,我已经制作了录音机并且它能很好地完成录制并在录制后播放音频但是一旦我关闭了节目,它就消失了.我能做什么?这是我到目前为止编写的完整代码:
class RecordViewController: UIViewController , AVAudioPlayerDelegate, AVAudioRecorderDelegate { @IBOutlet weak var RecordButton: UIButton! @IBOutlet weak var PlayButton: UIButton! var soundRecorder : AVAudioRecorder! var soundPlayer : AVAudioPlayer! var recordedAudio: RecordedAudio! var fileName = "audioFile.m4a" override func viewDidLoad() { super.viewDidLoad() setupRecorder() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func setupRecorder() { let recordSettings : [String : AnyObject] = [ AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC), AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue as NSNumber, AVEncoderBitRateKey : 320000 as NSNumber, AVNumberOfChannelsKey: 2 as NSNumber, AVSampleRateKey : 44100.0 as NSNumber ] do { try soundRecorder = AVAudioRecorder(URL: getFileURL(), settings: recordSettings) soundRecorder.delegate = self soundRecorder.prepareToRecord() } catch { print(error) } } func getCacheDirectory() -> String { let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) return paths[0] } func getFileURL() -> NSURL{ let path = getCacheDirectory().stringByAppendingPathComponent(fileName) let filePath = NSURL(fileURLWithPath: path) return filePath } func preparePlayer() { do { try soundPlayer = AVAudioPlayer(contentsOfURL: getFileURL()) soundPlayer.delegate = self soundPlayer.prepareToPlay() soundPlayer.volume = 1.0 } catch { print(error) } } @IBAction func Record(sender: UIButton) { if sender.titleLabel?.text! == "Record" { soundRecorder.record() sender.setTitle("Stop", forState: .Normal) PlayButton.enabled = false } else { soundRecorder.stop() sender.setTitle("Record", forState: .Normal) PlayButton.enabled = false } } @IBAction func PlaySound(sender: UIButton) { if sender.titleLabel?.text! == "Play" { RecordButton.enabled = false sender.setTitle("Stop", forState: .Normal) preparePlayer() soundPlayer.play() } else { soundPlayer.stop() sender.setTitle("Play", forState: .Normal) } } func audioRecorderDidFinishRecording(recorder: AVAudioRecorder, successfully flag: Bool) { PlayButton.enabled = true recordedAudio = RecordedAudio() recordedAudio.filePathUrl = recorder.url recordedAudio.title = recorder.url.lastPathComponent print(recordedAudio.title) } func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { RecordButton.enabled = true PlayButton.setTitle("Play", forState: .Normal) }
TwoStraws.. 6
我认为当应用程序退出时,文件可能仍然存在,问题是您的viewDidLoad()
方法立即调用setupRecorder()
,这反过来创建一个新的AVAudioRecorder
使用与上次完全相同的文件名 - 覆盖您的工作.
为帮助您重新安排代码,请转到audioRecorderDidFinishRecording()
并更改print(recordedAudio.title)
为print(recorder.url)
.如果您在iOS模拟器中运行,那么将为您提供一条到OS X磁盘驱动器上的确切文件名的长路径.
如果你使用Finder在那里浏览,你将能够看到你的"audioFile.m4a"文件被反复创建和覆盖,这将让你准确地看到你的问题发生的时间.如果你想看到确切的问题,在你打电话时在你的代码中设置一个断点prepareToPlay()
,检查文件的大小,然后按F6执行那行代码,然后再次检查文件的大小 - 你应该看到它被清除了:)
解决方案可能是每次都生成一个新的文件名.你可以使用NSUUID
它,如果你想:
let filename = NSUUID().UUIDString + ".m4a"
您可能会发现我的AVAudioRecorder教程很有用.
注意:您的getCacheDirectory()
方法命名不佳.它正在获取文件目录,而不是缓存目录,这在尝试调试此类问题时有点像红色鲱鱼.
我认为当应用程序退出时,文件可能仍然存在,问题是您的viewDidLoad()
方法立即调用setupRecorder()
,这反过来创建一个新的AVAudioRecorder
使用与上次完全相同的文件名 - 覆盖您的工作.
为帮助您重新安排代码,请转到audioRecorderDidFinishRecording()
并更改print(recordedAudio.title)
为print(recorder.url)
.如果您在iOS模拟器中运行,那么将为您提供一条到OS X磁盘驱动器上的确切文件名的长路径.
如果你使用Finder在那里浏览,你将能够看到你的"audioFile.m4a"文件被反复创建和覆盖,这将让你准确地看到你的问题发生的时间.如果你想看到确切的问题,在你打电话时在你的代码中设置一个断点prepareToPlay()
,检查文件的大小,然后按F6执行那行代码,然后再次检查文件的大小 - 你应该看到它被清除了:)
解决方案可能是每次都生成一个新的文件名.你可以使用NSUUID
它,如果你想:
let filename = NSUUID().UUIDString + ".m4a"
您可能会发现我的AVAudioRecorder教程很有用.
注意:您的getCacheDirectory()
方法命名不佳.它正在获取文件目录,而不是缓存目录,这在尝试调试此类问题时有点像红色鲱鱼.