【问题标题】:Saving Recorded Audio (Swift)保存录制的音频 (Swift)
【发布时间】:2016-03-25 12:56:02
【问题描述】:

我正在尝试使用 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)
}

【问题讨论】:

    标签: ios swift audio save


    【解决方案1】:

    我认为当应用程序退出时该文件可能仍然存在,问题是您的 viewDidLoad() 方法立即调用 setupRecorder(),这反过来又使用与上次完全相同的文件名创建了一个新的 AVAudioRecorder - 覆盖你的工作。

    为了帮助您重新安排代码,请转到 audioRecorderDidFinishRecording() 并将 print(recordedAudio.title) 更改为 print(recorder.url)。如果您在 iOS 模拟器中运行,它将为您提供一条指向 OS X 磁盘驱动器上确切文件名的长路径。

    如果您使用 Finder 浏览那里,您将能够看到您的“audioFile.m4a”文件一次又一次地被创建和覆盖,这将让您准确地看到问题发生的时间。如果您想查看确切的问题,请在调用 prepareToPlay() 时在代码中设置断点,检查文件大小,然后按 F6 执行该行代码,然后再次检查文件大小 - 您应该会看到它已被清除:)

    解决方案可能是每次都生成一个新文件名。如果你愿意,你可以使用NSUUID

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

    您可能会发现my tutorial on AVAudioRecorder 很有用。

    注意:您的 getCacheDirectory() 方法命名不当。它获取的是文档目录,而不是缓存目录,这在尝试调试此类问题时有点牵强。

    【讨论】:

    • 非常感谢!我很感激。
    • 你好。很抱歉打扰,但我尝试在我的 iPhone 上运行该应用程序并因以下错误而崩溃:Error Domain=NSOSStatusErrorDomain Code=1685348671 "(null)" 我该怎么办?
    • 您需要发布一个新问题,以便其他人可以找到它;我现在远离我的笔记本电脑。尽可能多地发布信息!
    • @Farzam 我有同样的问题,一旦我关闭应用程序,文件就会被删除。你是怎么解决的?谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多