2015-12-18 2 views
3

Я пытаюсь записать аудио с AVAudioRecorder, а затем сохранить его, чтобы впоследствии использовать его. До сих пор я сделал Recorder, и он отлично справляется с работой и воспроизводит звук после записи, но как только я закрою программу, она исчезла. что я могу сделать? Вот весь код, который я написал до сих пор:Сохранение записанного аудио (Swift)

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

ответ

4

Я думаю, что файл, вероятно, все еще там, когда приложение завершает работу, проблема заключается в том, что ваш метод viewDidLoad() немедленно вызывает setupRecorder(), что, в свою очередь, создает новый AVAudioRecorder используя точно то же имя файла, что и в прошлый раз - перезапись вашей работы.

Чтобы помочь вам спланировать ваш код, перейдите на страницу audioRecorderDidFinishRecording() и обменивайтесь print(recordedAudio.title) на print(recorder.url). Если вы работаете в iOS Simulator, который даст вам длинный путь к точному имени файла на вашем жестком диске OS X.

Если вы просматриваете страницу с помощью Finder, вы сможете увидеть, как ваш файл «audioFile.m4a» создается и перезаписывается снова и снова, что позволит вам точно увидеть, когда возникла ваша проблема. Если вы хотите увидеть точную проблему, установите контрольную точку в своем коде при вызове prepareToPlay(), проверьте размер своего файла, затем нажмите F6, чтобы выполнить эту строку кода, а затем снова проверьте размер своего файла - вы увидите, что он очищается :)

Решение, вероятно, должно генерировать новое имя файла каждый раз. Вы можете использовать NSUUID для этого, если вы хотите:

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

Вы могли бы найти my tutorial on AVAudioRecorder полезным.

Примечание: ваш метод getCacheDirectory() плохо назван. Он извлекает каталог документов, а не каталог кешей, который является немного красной селедкой при попытке отладки таких проблем.

+0

спасибо! Я ценю это. – Farzam

+0

Добро пожаловать! – TwoStraws

+0

привет снова. жаль беспокоить, но я попытался запустить приложение на своем iPhone, и он разбился с этой ошибкой: Ошибка домена = NSOSStatusErrorDomain Code = 1685348671 "(null)" что я могу сделать? – Farzam

Смежные вопросы