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

Другие вопросы по тегам