当前位置:  开发笔记 > IOS > 正文

保存录制的音频(Swift)

如何解决《保存录制的音频(Swift)》经验,为你挑选了1个好方法。

我正在尝试用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()方法命名不佳.它正在获取文件目录,而不是缓存目录,这在尝试调试此类问题时有点像红色鲱鱼.



1> TwoStraws..:

我认为当应用程序退出时,文件可能仍然存在,问题是您的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()方法命名不佳.它正在获取文件目录,而不是缓存目录,这在尝试调试此类问题时有点像红色鲱鱼.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有