如何使用Swift通过用户输入保存录音文件?

时间:2018-11-11 16:23:47

标签: ios swift avfoundation

我的情况是,我试图创建audio record并将文件保存到iPhone documentdirectory中。

我已经完成了录制功能,但是我需要根据用户输入来实现save file名称。在audio record之后,如果用户单击“保存”按钮,则我用filealertviewcontroller向用户询问textfield的名称。

在这里,我的音频文件通过static文件名(audio.m4a)保存,因为在viewdidload内我实现了保存文档目录代码,但是我不知道如何根据用户输入的内容来实现保存文件名保存操作。

override func viewDidLoad() {
  super.viewDidLoad() 
  let session = AVAudioSession.sharedInstance()
        try? session.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try? session.overrideOutputAudioPort(.speaker)
        try? session.setActive(true)
        if let basePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
            let baseComponents = [basePath,"audio.m4a"]
            if let audioURL = NSURL.fileURL(withPathComponents: baseComponents) {
                var settings: [String: Any] = [:]
                self.audioURL = audioURL
                settings[AVFormatIDKey] = Int(kAudioFormatMPEG4AAC)
                settings[AVSampleRateKey] = 44100.0
                settings[AVNumberOfChannelsKey] = 2
                audioRecorder = try? AVAudioRecorder(url: audioURL, settings: settings)
                audioRecorder?.prepareToRecord()
            }
        }
}

@IBAction func record_click(_ sender: Any) {
        if let audioRecorder = self.audioRecorder {
            if (audioRecorder.isRecording) {
                audioRecorder.stop()
           } else {
                audioRecorder.record()
            }
        }
    }

// Within below action I am calling alertview with textfield for asking file name
@IBAction func save_click(_ sender: Any) {
   self.savefileAlertView()
}

2 个答案:

答案 0 :(得分:0)

如果要设置已经保存的文件名,可以重命名。

您可以创建此功能

func renameAudio(newTitle: String) {
    do {
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let documentDirectory = URL(fileURLWithPath: path)
        let originPath = documentDirectory.appendingPathComponent("audio.m4a")
        let destinationPath = documentDirectory.appendingPathComponent("\(newTitle).m4a")
        try FileManager.default.moveItem(at: originPath, to: destinationPath)
    } catch {
        print(error)
    }
}

然后在警报控制器中使用它,并将警报内文本字段的文本作为参数传递。

答案 1 :(得分:0)

import UIKit
import AVFoundation
import Speech

class ViewController: UIViewController,AVSpeechSynthesizerDelegate {

var utterance = AVSpeechUtterance()
let synthesizer = AVSpeechSynthesizer()

var filename : String       = "audio.m4a"

@IBOutlet weak var speechBtnOutlet: UIButton!
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
    super.viewDidLoad()



    utterance = AVSpeechUtterance(string: self.textView.text)
    utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
    utterance.rate = 0.1
    synthesizer.delegate = self
    synthesizer.speak(utterance)

}

func renameAudio(newTitle: String) {
    do {
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let documentDirectory = URL(fileURLWithPath: path)

        let originPath = documentDirectory.appendingPathComponent(utterance.speechString)

        let destinationPath = documentDirectory.appendingPathComponent("\(newTitle).m4a")
        try FileManager.default.moveItem(at: originPath, to: destinationPath)

    } catch {
        print(error)
    }
}



  @IBAction func speechBtn(_ sender: Any) {       
   }
}