swift2 AVAudioRecorder

Posted

技术标签:

【中文标题】swift2 AVAudioRecorder【英文标题】: 【发布时间】:2015-06-28 01:20:15 【问题描述】:

我正在使用 swift 2 尝试以下代码,在 swift 1 中应该没问题。

class NewSoundViewController: UIViewController 
required init(coder aDecoder: NSCoder) 
    let audioURL = NSURL.fileURLWithPathComponents([
        NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0],
        "MyAudio.m4a"
    ])
    do 
        let session = AVAudiosession.sharedInstance()
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
     catch 
        print("Session errors.")
    

    do 
        let recordSettings: [String: AnyObject] = [
            AVFormatIDKey: kAudioFormatMPEG4AAC,
            AVSampleRateKey: 44100.0,
            AVNumberOfChannelsKey: 2,
        ]
        self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings)
        self.audioRecorder.meteringEnabled = true
        self.audioRecorder.prepareToRecord()

     catch let error as NSError
        print(error.description)
     catch 
        print("Other errors")            
    
    super.init(coder: aDecoder)

编译错误

类型“AudioFormatID”不符合协议“AnyObject”`

在线AVFormatIDKey: kAudioFormatMPEG4AAC,

如果我注释掉该行,我通过了构建,但出现了运行时错误

Error Domain=NSOSStatusErrorDomain Code=1718449215“操作无法完成。(OSStatus 错误 1718449215。)”

我也试过AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),,但出现运行时错误。 Xcode 似乎进入调试模式它红色突出显示self.audioRecorder = try AVAudioRecorder(URL: audioURL!, settings: recordSettings) 并表示

线程 1:EXC_BAD_ACCESS(code=1, address=0x0)

谁能帮帮我?

【问题讨论】:

【参考方案1】:

我也试过AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC)

嗯,这是正确的说法。基本上你在这里问两个问题;您已经解决的编译器错误。现在您遇到了运行时错误,但这是完全不同的问题。

至于运行时错误,它可能只是试图在模拟器上测试的虚构。我在设备上运行了你的代码(在修复了有问题的行以便它可以编译之后),这很好。

编辑在评论中,您透露您在运行 iOS 8.3 的设备上对此进行了测试。那就是问题所在!你需要在设备上进行测试,并且需要是运行 iOS 9 的设备。然后你会发现你的代码运行没有崩溃。

【讨论】:

嗯...我打印出 audioURL 并显示 MyAudio.m4a 所以我认为它不为零。 我测试了您的代码,它在设备上运行良好。您可能只是在模拟器上遇到问题,因为您无法在那里录制。 不幸的是,它不适用于我的 iPhone 或模拟器。无论如何感谢您的测试!。 我所做的唯一更改是将AVFormatIDKey: kAudioFormatMPEG4AAC 替换为AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC)。其余的完全如你所愿。它启动而不会崩溃。你需要我给你一份我的测试项目吗? — 另外,您还记得将您的设备更新到 iOS 9 吗? 如果你能把你的测试项目发给我,那就太好了。我很感激。我没有将我的设备更新到 iOS9,但我将项目的构建更改为 iOS8.3。【参考方案2】:

我在设置方面遇到了同样的问题。 AVFormatIDKey 不被接受,原帖中提到的错误。

recordSettings 需要在 Swift 2 中显式转换。

这些是我的录音设置。如果我只是跳过 AVFormatIDKey,麦克风只会工作不到一秒。

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

您无需将设备升级到 iOS 9。我为 iOS 8.4 构建并运行了它

【讨论】:

非常很有帮助,谢谢。我已经追了好几天了。【参考方案3】:

我遇到了类似的问题,结果当我从 swift 1.2 更新到 2.0 时,“设置”的签名更改为非可选的 [String : AnyObject]

//Swift 1.2
AVAudioRecorder(URL: audioURL!, settings: nil)

如果我传递一个空字典,它就不会再崩溃了,并且像以前一样工作。

//Swift 2.0    
AVAudioRecorder(URL: audioURL!, settings: [:])

【讨论】:

以上是关于swift2 AVAudioRecorder的主要内容,如果未能解决你的问题,请参考以下文章

Swift2.0 Multipeer Connectivity 无法连接

NSFetchRequest 上的 Swift2.0 CoreData 问题

swift2.0中文版教程

Swift2 - HKSampleQuery

Swift2 - HKSampleQuery

swift2:调用中的额外参数“错误”