在应用程序终止之前获取 AVAudio 录音 URL
Posted
技术标签:
【中文标题】在应用程序终止之前获取 AVAudio 录音 URL【英文标题】:Get AVAudio Recording URL Before App is Terminated 【发布时间】:2021-12-30 01:56:29 【问题描述】:我玩过几个录音应用程序,当我在录音时滑动关闭/终止时,当我回到应用程序时,在应用程序开始之前录制的音频终止,可供我收听。据我了解,音频只能通过audioRecorderDidFinishRecording
获得。
在我的应用程序中,我尝试做同样的事情。如果用户正在录制音频并且应用程序突然终止(他们将其滑开),我会停止录制。但是在代表audioRecorderDidFinishRecording
我似乎无法获得url
。
当应用程序终止时,docs 表示我们还有 5 秒
您实施此方法的时间大约为 5 秒 执行任何任务并返回。如果方法之前没有返回 时间到了,系统可能会完全终止进程。
url
通常会在 5 秒之前返回,但由于某种原因,从未到达录制委托。有什么问题?在下面的示例中,第 2 步或第 5 步永远不会到达。
NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate(notification:)),
name: UIApplication.willTerminateNotification,
object: nil)
@objc func applicationWillTerminate(notification: Notification)
if let micRecorder = micRecorder, micRecorder.isRecording
micRecorder.stop() // 1. stop recording
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool)
// 2. print("if successful the url should be returned")
if flag
let url = recorder.url
// 3. save url to FileManager then to CoreData
else
// 4. something went awry
func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?)
// 5. print("something went wrong")
print(error.localizedDescription)
【问题讨论】:
您在哪里创建AVAudioRecorder
?创建的时候不传个网址吗?
这和委托方法中返回的url是一样的吗?
应该是 -- URL 不应该改变。您在委托方法中所做的只是检查记录器的 url
属性,这是在 init
中设置的
哦,我不知道,我在函数的本地创建它。例如。 func startRecording() let path = NSTemporaryDirectory()... ; let fileURL = URL(fileURLWithPath: path) ; micRecorder = try AVAudioRecorder(url: fileURL, settings: myAudiosettings) ; micRecorder?.record() ...
我认为委托方法与 URL 没有任何关系。当你创建记录器时,你给它一个 URL——这就是记录的内容。如果您需要对 URL 的引用,请将其存储或确保您可以重新创建它。
【参考方案1】:
当您初始化AVAudioRecorder
时,您会向它传递一个 URL。此 URL 是记录音频数据的位置。该 URL 将与您尝试通过委托方法获取的 URL 相同。
您可以只存储您创建的初始 URL,或者确保您可以可靠地重新创建它,而不是尝试通过这些委托方法检索 URL。
【讨论】:
感谢您的帮助。绝对让我的生活更轻松! 我确实发现了一件事。它使事情变得更加复杂。当用户记录、停止、记录、停止等时,我必须使用不同的 URL 初始化 audioRecorder,否则它将继续覆盖相同的 URL,并且只会记录他们记录的最后一件事。发生这种情况时,委托方法中的 url 可以正常工作。但是,当解除委托方法时,我们仍然没有触发。我必须保留所有这些停止和记录网址的单独数组。这是一个乏味的过程,但无论如何你的回答都帮助我弄清楚了。谢谢! 建议(可能)避免上述问题 - 始终记录到相同的 URL。然后,完成后,将文件移动到具有更多信息文件名的其他位置(例如录制时) 有趣。使用相同 URL 的目的是什么?我让用户停止,记录,停止,记录......当使用不同的 URL 时,我注意到当我使用委托方法时,如果标志为真,我只是将它们全部保存在数组中,然后使用 AVMutableMixComposition 将它们全部变成 1 完成使用 AVAudioPlayer 收听的 url。您建议的方式,如果我使用 1 个 url,我在什么时候将每条记录/停止转为它自己的个人 url?似乎是同一件事,因为在应用程序终止问题之外,无论哪种方式,我都必须使用委托方法来保留每个录音的副本。 Np,感谢您抽出宝贵时间提供帮助!节日快乐,编码快乐!!!以上是关于在应用程序终止之前获取 AVAudio 录音 URL的主要内容,如果未能解决你的问题,请参考以下文章
iPhone App:不恢复 AVAudio Player 中的音频会话
在隐式展开可选值 AVAUDIO Player SWIFT 时意外发现 nil