SWIFT - возможно ли сохранить звук из AVAudioEngine или из AudioPlayerNode? Если да, то как?
Я искал документацию 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.
Любая помощь здесь?
2 ответа
Да, это довольно просто. Вы просто нажимаете на узел и сохраняете буфер в файл.
К сожалению, это означает, что вы должны играть через узел. Я надеялся, что AVAudioEngine позволит мне напрямую обрабатывать один звуковой файл в другом, но, по-видимому, это невозможно - вам нужно проигрывать и обрабатывать в реальном времени.
Оффлайн рендеринг Работал для меня, используя GenericOutput AudioUnit. Пожалуйста, проверьте эту ссылку, я сделал смешивание двух, трех аудио в автономном режиме и объединить его в один файл. Не тот же сценарий, но он может помочь вам получить представление. ядро аудио в автономном режиме рендеринга GenericOutput