简体   繁体   中英

Saving Recorded Audio (Swift)

I'm trying to record an audio with AVAudioRecorder and then save it so i can use it later. So far I have Made the Recorder and it does the job well and plays the audio after recording but as soon as i close the program, it's gone. what can I do? Here's the entire code I have written so far :

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)
}

I think the file is probably still there when the app quits, the problem is that your viewDidLoad() method immediately calls setupRecorder() , which in turn creates a new AVAudioRecorder using exactly the same filename as last time – overwriting your work.

To help you re-arrange your code, go to audioRecorderDidFinishRecording() and change print(recordedAudio.title) to print(recorder.url) . If you're running in the iOS Simulator that will give you a long path to an exact filename on your OS X disk drive.

If you browse there using Finder you'll be able to see your "audioFile.m4a" file being created and overwritten again and again, which will let you see exactly when your problem occurs. If you want to see the exact problem, set a breakpoint in your code when you call prepareToPlay() , check your file's size, then press F6 to execute that line of code, then check your file's size again – you should see it being cleared :)

The solution is probably to generate a new filename every time. You could use NSUUID for that if you wanted:

let filename = NSUUID().UUIDString + ".m4a"

You might find my tutorial on AVAudioRecorder useful.

Note: your getCacheDirectory() method is poorly named. It's fetching the documents directory, not the caches directory, which is a bit of a red herring when trying to debug issues like this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM