Swift -- Audio Recorder/Voice Changer App:这些功能有啥关系?

Posted

技术标签:

【中文标题】Swift -- Audio Recorder/Voice Changer App:这些功能有啥关系?【英文标题】:Swift -- Audio Recorder/Voice Changer App: How are these functions related?Swift -- Audio Recorder/Voice Changer App:这些功能有什么关系? 【发布时间】:2015-02-25 00:58:38 【问题描述】:

我正在创建的录音机应用程序中有两个函数(遵循 Udacity 教程)。我试图了解这两个函数之间的关系:

    @IBAction func recordButton(sender: UIButton) 

    recordB.hidden = true
    inProgress.hidden = false
    stopButtonHide.hidden = false
    let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

    let currentDateTime = NSDate()
    let formatter = NSDateFormatter()
    formatter.dateFormat = "ddMMyyyy-HHmmss"
    let recordingName = formatter.stringFromDate(currentDateTime)+".wav"
    let pathArray = [dirPath, recordingName]
    let filePath = NSURL.fileURLWithPathComponents(pathArray)
    println(filePath)

    var session = AVAudiosession.sharedInstance()
    session.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)


    audioRecorder = AVAudioRecorder(URL: filePath, settings: nil, error: nil)
    audioRecorder.delegate = self
    audioRecorder.meteringEnabled = true
    audioRecorder.prepareToRecord()
    audioRecorder.record()


func audioRecorderDidFinishRecording(recorder: AVAudioRecorder!, successfully flag: Bool) 
    if(flag) 
        recordedAudio = RecordedAudio()
        recordedAudio.filePathUrl = recorder.url
        recordedAudio.title = recorder.url.lastPathComponent
        self.performSegueWithIdentifier("stopRecording", sender: recordedAudio)
     else 
        println("Recording was not succesful")
        recordB.enabled = true
        stopButtonHide.hidden = true
    


第一个函数开始录制(据我所知),创建并存储一个音频文件(命名并获取路径。)第二个函数检查录制是否完成。我的问题是我看不到这两个函数是如何连接的。第二个函数如何知道在第一个函数中检查记录?有一个名为 RecordedAudio.swift 的单独类,它有两个变量:

import Foundation

class RecordedAudio: NSObject
var filePathUrl: NSURL!
var title: String!

为什么我需要这个课程?这个类的目的是什么(我知道它是 MVC 的模型部分,但仅此而已)?我试图了解我的代码中发生了什么,因为从我正在关注的教程中我并不清楚。

【问题讨论】:

我在这里遇到的主要问题是第一个函数的音频如何传递给第二个函数:第二个函数是否获取正在录制的任何音频? recorder.urlrecorder.url.lastPathComponant 是如何工作的?这两项是如何获取数据的? 【参考方案1】:

    似乎recordedAudio 是一个RecordedAudio 对象,因此需要该类。

    audioRecorderDidFinishRecording 是 (as stated in the docs) 一个 AVAudioRecorderDelegate 方法并且自动...

当录制因达到其时间限制而停止或完成时由系统调用。

在这种情况下,“录制”将引用您在 recordButton: 中创建的 AVAudioRecorder audioRecorder(并且您已为其设置了 AVAudioRecorderDelegate 以触发 audioRecorderDidFinishRecording: 方法)。

【讨论】:

所以换句话说audioRecorderDidFinishRecording 会在任何AVAudioRecorder 完成时触发(该函数及其代码被执行)?因此,如果由于某种原因我有两个 audioRecorder 对象,如果其中一个对象完成,它就会被触发?至于 recorededAudio 是一个 RecorededAudio 对象,我了解很多,但我不明白为什么我需要首先创建该类。为什么该类需要它的两个与路径相关的变量?该类在存储记录的数据方面做了什么以及如何存储?为什么原始函数不足以存储数据? @JasonHolt 是的。只要您为两者都设置了代表。 最终会发生的是,我最终会将录制的音频数据发送到新的 ViewController。所以我试图弄清楚我是如何从“这就是你在 Swift 中录制音频的方式”到你需要另一个类来存储数据和一个函数来检查音频是否完成录制以及完成录制的函数的方式不知何故知道原始数据并将其存储在您创建的第二个类中。 @JasonHolt 委托方法的全部意义在于“以某种方式知道”事情。 url 是您在初始化 avaudiorecorder 时设置的 url,它的 lastComponent 只是该 url 的最后一部分 (developer.apple.com/library/ios/documentation/Cocoa/Reference/…) 查看更多文档后重新阅读您的答案会使事情更加清晰。这是因为我设置了这两个函数相互通信的委托,因为如果没有设置委托,audioRecorderDidFinishRecording 就无法实现。 MVC 的模型部分是仅用于保存数据的属性还是数据本身?看起来如果它是为了保存数据,则记录的音频将需要具有音频文件。感谢您的所有帮助。

以上是关于Swift -- Audio Recorder/Voice Changer App:这些功能有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

Swift -- Audio Recorder/Voice Changer App:这些功能有啥关系?

在 Swift 5 中停止声音

在 Swift 中注册 AURenderCallback

Swift - 音频 - 按钮声音不断出错

使用 Swift 将录音上传到 Firebase

Swift installTap 使用蓝牙麦克风产生“花栗鼠”音频