SWIFT - 是不是可以从 AVAudioEngine 或 AudioPlayerNode 保存音频?如果是,如何?
Posted
技术标签:
【中文标题】SWIFT - 是不是可以从 AVAudioEngine 或 AudioPlayerNode 保存音频?如果是,如何?【英文标题】:SWIFT - Is it possible to save audio from AVAudioEngine, or from AudioPlayerNode? If yes, how?SWIFT - 是否可以从 AVAudioEngine 或 AudioPlayerNode 保存音频?如果是,如何? 【发布时间】:2015-07-19 13:34:43 【问题描述】:我一直在查看 Swift 文档以保存来自 AVAudioEngine 的音频输出,但找不到任何有用的提示。 有什么建议吗?
解决方案 感谢马特的回答,我找到了解决办法。 这里是如何在通过 AVAudioEngine 后保存音频的示例代码(我认为从技术上讲它是以前的)
newAudio = AVAudioFile(forWriting: newAudio.url, settings: nil, error: NSErrorPointer())
//Your new file on which you want to save some changed audio, and prepared to be bufferd in some new data...
var audioPlayerNode = AVAudioPlayerNode() //or your Time pitch unit if pitch changed
//Now install a Tap on the output bus to "record" the transformed file on a our newAudio file.
audioPlayerNode.installTapOnBus(0, bufferSize: (AVAudioFrameCount(audioPlayer.duration)), format: opffb)
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in
if (self.newAudio.length) < (self.audioFile.length)//Let us know when to stop saving the file, otherwise saving infinitely
self.newAudio.writeFromBuffer(buffer, error: NSErrorPointer())//let's write the buffer result into our file
else
audioPlayerNode.removeTapOnBus(0)//if we dont remove it, will keep on tapping infinitely
println("Did you like it? Please, vote up for my question")
希望这会有所帮助!
要解决的一个问题:
有时,您的 outputNode 比输入短:如果您将时间速率加快 2,您的音频将缩短 2 倍。这是我现在面临的问题,因为我保存文件的条件是(第 10 行)
if(newAudio.length) < (self.audioFile.length)//audiofile being the original(long) audio and newAudio being the new changed (shorter) audio.
这里有什么帮助吗?
【问题讨论】:
这里:Apple doc to export from AV 谢谢@eric D.,我正在浏览代码。看起来它会完成这项工作。然而,我发现了很多东西,我必须理解很多行。如果我提出问题可以吗?例如,我如何加载不是带有 URL 的 AudioFile 而是 audioEngine 或 AudioNode 的资产?你看过这段代码吗? 个人而言,不是真的,我只是认为您可能错过了这个文档,所以我粘贴了链接。但这不是问题:问题是你不能就 SO 提出太宽泛的问题。无论如何,cmets 都不是这个地方。我建议您创建一个新问题,包括您当前的代码,显示您尝试实现的目标以及您遇到的困难,或者类似的东西。哦,每个帖子都有 一个 主题。顺便说一句,欢迎来到 SO。 :) 谢谢,我刚注册,这是我的第一个问题。我这似乎不是一个广泛的问题:AVAudioEngine to Audiofile?我将使用代码发布一个更精确的新问题!再次非常感谢您,您的文档非常相关,可惜我无法为您的答案投票。 我的意思是 this 问题很广泛。 :) 这就是为什么我只发布了 cmets 中文档的链接。这个问题不适合正确的答案。不管怎样,in the Tour 和the Help Center 都很好地描述了。玩得开心! 【参考方案1】:是的,这很容易。您只需点击一个节点并将缓冲区保存到一个文件中。
不幸的是,这意味着您必须通过节点播放。我希望 AVAudioEngine 可以让我直接将一个声音文件处理成另一个,但显然这是不可能的 - 你必须实时播放和处理。
【讨论】:
谢谢,这对我帮助很大。一件事,如果您在audioNode上安装水龙头,我认为您不需要播放。我还没有尝试过,但实际上我不需要它,因为我在保存之前播放了音频。就像健全性检查一样。 好吧,我会再试一次,但在我的测试中,如果没有实际播放缓冲区,我无法保存文件。 你能提供保存新音频的例子吗?【参考方案2】:离线渲染使用 GenericOutput AudioUnit 为我工作。请检查此链接,我已经完成了离线混合两个、三个音频并将其合并到一个文件中。不是相同的场景,但它可能会帮助您获得一些想法。 core audio offline rendering GenericOutput
【讨论】:
以上是关于SWIFT - 是不是可以从 AVAudioEngine 或 AudioPlayerNode 保存音频?如果是,如何?的主要内容,如果未能解决你的问题,请参考以下文章
SWIFT - 是不是可以从 AVAudioEngine 或 AudioPlayerNode 保存音频?如果是,如何?
AlamofireImage:是不是可以从 Swift 中的 NSimageview 获取原始数据?
在将应用程序从 swift 迁移到本机反应后,是不是可以在应用程序中检索用户令牌?
Swift - PFObject 从保存回调而不是布尔返回自身