ios - AVAudioRecorder swift 2

标签 ios swift2 avaudiorecorder

我的 AVAudioRecorder 工作正常,但自升级到 swift 2 后,我似乎无法弄清楚如何正确配置它。我一直收到一条错误消息,提示无法调用 AVAudioRecorder 初始值设定项,但我提供的参数对我来说是正确的。

var recordSettings = [AVSampleRateKey : NSNumber(float: Float(44100.0)),
    AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)),
    AVNumberOfChannelsKey : NSNumber(int: 1),
    AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Medium.rawValue))]


var recordingURL: NSURL? = nil
var audioRecorder:AVAudioRecorder!


func directoryURL() -> NSURL? {

    let fileManager = NSFileManager.defaultManager()
    let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    let documentDirectory = urls[0] as NSURL
    let soundURL = documentDirectory.URLByAppendingPathComponent("sound.m4a")
    return soundURL 
}

@IBAction func recordPressed(sender: AnyObject) {

    let audioSession: AVAudioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    } catch _ {
    }

    do {
        try audioSession.setActive(true)
    } catch _ {
    }

    var error: NSError?

    audioRecorder = AVAudioRecorder(URL: recordingURL, settings: recordSettings, error: &error)

    if let e = error {

        print(e.localizedDescription, terminator: "")
    }
    else
    {
        audioRecorder.record()
        self.stopButton.enabled = true
        self.playButton.enabled = false
        self.recordButton.enabled = false

    }


}

最佳答案

directoryURL 是正确的,但它似乎被误认为是 recordingURLrecordSettings 也是连贯的。让我提供一个工作版本。

swift 3

var audioRecorder:AVAudioRecorder!

let recordSettings = [
    AVSampleRateKey : NSNumber(value: Float(44100.0)),
    AVFormatIDKey : NSNumber(value:Int32(kAudioFormatMPEG4AAC)),
    AVNumberOfChannelsKey : NSNumber(value: Int32(1)),
    AVEncoderAudioQualityKey :
        NSNumber(value: Int32(AVAudioQuality.medium.rawValue))]

override func viewDidLoad() {
    super.viewDidLoad()

    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try audioRecorder = AVAudioRecorder(url: directoryURL()!,
                                            settings: recordSettings)
        audioRecorder.prepareToRecord()
    } catch {}
}

func directoryURL() -> URL? {
    let fileManager = FileManager.default
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = urls[0] as URL
    let soundURL = documentDirectory.appendingPathComponent("sound.m4a")
    return soundURL
}

@IBAction func doRecordAction(_ sender: AnyObject) {
    if !audioRecorder.isRecording {
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setActive(true)
            audioRecorder.record()
        } catch {}
    }
}

@IBAction func doStopAction(_ sender: AnyObject) {
    audioRecorder.stop()
    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setActive(false)
    } catch {}
}

旧版:Swift 2

var audioRecorder:AVAudioRecorder!

let recordSettings = [AVSampleRateKey : NSNumber(float: Float(44100.0)),
    AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)),
    AVNumberOfChannelsKey : NSNumber(int: 1),
    AVEncoderAudioQualityKey :
        NSNumber(int: Int32(AVAudioQuality.Medium.rawValue))]

override func viewDidLoad() {
    super.viewDidLoad()

    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try audioRecorder = AVAudioRecorder(URL: self.directoryURL()!,
            settings: recordSettings)
        audioRecorder.prepareToRecord()
    } catch {}
}

func directoryURL() -> NSURL? {
    let fileManager = NSFileManager.defaultManager()
    let urls = fileManager.URLsForDirectory(.DocumentDirectory,
                                            inDomains: .UserDomainMask)
    let documentDirectory = urls[0] as NSURL
    let soundURL = documentDirectory.URLByAppendingPathComponent("sound.m4a")
    return soundURL 
}

@IBAction func doRecordAction(sender: AnyObject) {
    if !audioRecorder.recording {
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setActive(true)
            audioRecorder.record()
        } catch {}
    }
}

@IBAction func doStopAction(sender: AnyObject) {
    audioRecorder.stop()
    let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setActive(false)
    } catch {}
}

► 在 GitHub 上找到此解决方案以及有关 Swift Recipes 的更多详细信息.

关于ios - AVAudioRecorder swift 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342486/

相关文章:

ios - AVAudioRecorder 不会创建可以打开和播放的.m4a 文件

ios - 使用来自包含 block 的两个方法的信息删除 UITableViewRows

ios - 在 iOS 中使用 Firebase 数据库检索数据

sprite-kit - 如何创建波浪路径 Swift

ios - Swift UIImage 扩展

iphone - 如何使用 AVAudioRecorder 恢复录音?

objective-c - GKLeaderboardViewController 初始排行榜

ios - 如何在 imageview ios 中获取自定义图像的像素颜色值?

ios - 升级到 Swift 3 时使用未声明的类型

ios - 调用 record() 时 AVAudioRecorder 长延迟