SWIFT - 是否可以从 AVAudioEngine 或 AudioPlayerNode 中保存音频?如果可以,如何操作?

6
我一直在查找Swift文档以保存AVAudioEngine的音频输出,但我没有找到任何有用的提示。 有什么建议吗?
解决方案 我通过matt的答案找到了一个方法。以下是如何在通过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")
        }

    }

希望这能帮到你!
需要解决的一个问题:
有时,你的输出节点比输入节点短:如果你将时间速率加速2倍,你的音频长度将缩短2倍。这是我目前面临的问题,因为我保存文件的条件是(第10行)。
if(newAudio.length) < (self.audioFile.length)//audiofile being the original(long) audio and newAudio being the new changed (shorter) audio.

有什么可以帮您的吗?


请点击此处查看苹果文档,了解如何从AV中进行导出。链接:https://developer.apple.com/library/prerelease/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/05_Export.html#//apple_ref/doc/uid/TP40010188-CH9-SW2 - Eric Aya
感谢@eric D.,我正在通读这段代码。看起来它会完成任务。尽管如此,有很多东西我正在发现和许多行我必须理解。如果我提出问题的话是否可以?例如,如何加载不是音频文件的 Asset,而是一个 audioEngine 或 AudioNode 呢? 你是否曾经浏览过这段代码? - mlk
1
个人而言,不是很在意,我只是想你可能错过了这份文档,所以我贴了链接。但问题不在于此:你不能在SO上问太宽泛的问题。而且评论也不是这样的地方。我建议你创建一个新的问题,包括你当前的代码,展示你尝试实现什么以及遇到了哪些困难,或者类似的内容。哦,对了,每个帖子只能有一个主题。顺便说一句,欢迎来到SO :) - Eric Aya
谢谢,我刚刚注册,这是我的第一个问题。它似乎不是一个广泛的问题:AVAudioEngine转换为音频文件?我将发布一个更精确的带有代码的新问题!再次感谢您,您的文档非常相关,可惜我不能为您的答案投票。 - mlk
我的意思是这个问题很广泛。 :) 这就是为什么我只在评论中发布了文档链接。这个问题不适合一个恰当的答案。无论如何,在TourHelp Center中都有非常好的描述。玩得开心! - Eric Aya
2个回答

5

是的,这很容易。您只需在节点上放置一个标签,并将缓冲区保存到文件中。

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


谢谢,这对我很有帮助。 另外,如果你在audioNode上安装了tap,我认为你不需要播放它。我还没有尝试过,但实际上我不需要它,因为我在保存之前总是先播放音频。就像一个健全性检查。 - mlk
好的,我会再试一次,但在我的测试中,我无法在不通过缓冲区实际播放文件的情况下保存文件。 - matt
你能提供保存新音频的示例吗? - Bhavin Ramani

2

使用通用输出AudioUnit,离线渲染对我有用。请查看此链接,我已经将两个、三个音频混合并离线组合成一个单独的文件。虽然情境不同,但这可能会帮助您获得一些想法。核心音频离线渲染GenericOutput


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接