SWIFT-是否可以从AVAudioEngine或AudioPlayerNode保存音频?如果是,如何进行?

SWIFT-是否可以从AVAudioEngine或AudioPlayerNode保存音频?如果是,如何进行?,swift,avasset,avaudioengine,avaudioplayernode,avaudiofile,Swift,Avasset,Avaudioengine,Avaudioplayernode,Avaudiofile,我一直在查看Swift文档,以保存AVAudioEngine的音频输出,但找不到任何有用的提示。 有什么建议吗 解决方案 多亏了马特的回答,我找到了解决问题的办法。 下面是一个示例代码,说明如何在通过AVAudioEngine后保存音频(我认为从技术上讲,它是以前的) newAudio=AVAudioFile(用于写入:newAudio.url,设置:nil,错误:NSErrorPointer()) //您要在其上保存一些更改的音频并准备在一些新数据中缓冲的新文件。。。 var audioPla

我一直在查看Swift文档,以保存AVAudioEngine的音频输出,但找不到任何有用的提示。
有什么建议吗

解决方案 多亏了马特的回答,我找到了解决问题的办法。 下面是一个示例代码,说明如何在通过AVAudioEngine后保存音频(我认为从技术上讲,它是以前的)

newAudio=AVAudioFile(用于写入:newAudio.url,设置:nil,错误:NSErrorPointer())
//您要在其上保存一些更改的音频并准备在一些新数据中缓冲的新文件。。。
var audioPlayerNode=AVAudioPlayerNode()//如果音高发生变化,则使用时间音高单位
//现在在输出总线上安装一个Tap,将转换后的文件“录制”到我们的新音频文件上。
audioPlayerNode.installTapOnBus(0,缓冲区大小:(AVAudioFrameCount(audioPlayer.duration)),格式:opffb){
(缓冲区:avaudiopcbuffer!,时间:AVAudioTime!)在
如果(self.newAudio.length)<(self.audioFile.length){//请告诉我们何时停止保存文件,否则将无限保存
self.newAudio.writeFromBuffer(buffer,error:NSErrorPointer())//让我们将缓冲区结果写入文件
}否则{
audioPlayerNode.removeTapOnBus(0)//如果我们不删除它,它将继续无限地点击
println(“你喜欢吗?请投票支持我的问题”)
}
}
希望这有帮助

需要解决的一个问题:

有时,您的输出节点比输入节点短:如果您将时间速率加快2,您的音频将缩短2倍。这是我目前面临的问题,因为我保存文件的条件是(第10行)

if(newAudio.length)<(self.audioFile.length)//audioFile是原始(长)音频,newAudio是新更改(短)音频。

这里有什么帮助吗?是的,很简单。只需点击一个节点并将缓冲区保存到文件中


不幸的是,这意味着您必须通过节点进行播放。我希望AVAudioEngine能让我直接将一个声音文件处理成另一个声音文件,但显然这是不可能的——你必须实时播放和处理。

离线渲染对我来说很有用,使用GenericOutput AudioUnit。请检查这个链接,我已经做了混合两,三个音频脱机,并结合到一个单一的文件。不同的情况下,但它可能会帮助你得到一些想法

这里:谢谢@eric D.,我正在检查代码。看起来它能完成任务。尽管如此,我还是发现了很多东西,需要理解很多台词。我可以提问吗?例如,我如何加载一个不是带有URL的音频文件而是音频引擎或音频节点的资产?你看过这段代码吗?从个人角度来说,不是真的,我只是觉得你可能错过了这个文档,所以我粘贴了链接。但这不是问题所在:问题是你不能问太宽泛的问题。无论如何,评论都不是这个地方。我建议您创建一个新问题,包括您当前的代码,显示您试图实现的目标以及您的奋斗目标,或者类似的内容。哦,每个帖子一个主题。顺便说一句,欢迎来到SO.:)谢谢,我刚报名,这是我的第一个问题。我认为这似乎不是一个宽泛的问题:从音频引擎到音频文件?我将发布一个新的问题更准确的代码!再次非常感谢你,你的医生非常相关,很遗憾我不能投票支持你的答案。我的意思是这个问题很广泛。:)这就是为什么我只在评论中发布了一个指向文档的链接。这个问题不适合作正确的回答。不管怎样,这一切都被描述得很好,也很好。玩得高兴谢谢,伙计,这对我帮助很大。有一件事,如果你在audioNode上安装了tap,我认为你不需要播放。我还没有试过,但实际上我并不需要它,因为在保存之前我会播放音频。就像一个健全的检查。好吧,我会再试一次,但在我的测试中,我无法得到文件保存没有实际通过缓冲区播放。你能提供一个例子来保存新的音频吗?
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")
        }

    }
if(newAudio.length) < (self.audioFile.length)//audiofile being the original(long) audio and newAudio being the new changed (shorter) audio.