2015-05-08 11 views
5

Ho cercato la documentazione di Swift su salvando un'uscita audio da AVAudioEngine ma non sono riuscito a trovare alcun suggerimento utile.
Qualche suggerimento?SWIFT - È possibile salvare l'audio da AVAudioEngine o da AudioPlayerNode? Se sì, come?

Soluzione Ho trovato un modo per aggirare grazie alla risposta di Matt. Ecco un codice di esempio di come salvare un audio dopo averlo fatto passare attraverso un AVAudioEngine (credo che tecnicamente è prima)

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") 
     } 

    } 

Spero che questo aiuti!

Un problema da risolvere:

A volte, il vostro outputNode è più corto di ingresso: se si accelera il tasso di tempo da 2, l'audio sarà di 2 volte più brevi. Questa è la questione im rivolto per ora, poiché la mia condizione per il salvataggio del file è (linea 10)

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

Qualsiasi aiuto qui?

+0

Qui: [Apple doc per esportare da AV] (https://developer.apple.com/library/prerelease/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/05_Export.html#//apple_ref/doc/uid/TP40010188-CH9-SW2) – Moritz

+0

Grazie a @eric D., sto passando attraverso il codice. Sembra che farà il lavoro. Tuttavia, ci sono molte cose che sto scoprendo e molte linee che devo capire. Va bene se sollevo delle domande? Ad esempio, come posso caricare un asset che non è un AudioFile con URL ma un audioEngine o AudioNode? Hai mai letto questo codice? – mlk

+0

Personnamente, non proprio, ho pensato che potresti aver perso questo documento, quindi ho incollato il link. Ma non è questo il problema: la cosa è che non puoi fare domande troppo ampie su SO. E i commenti non sono il posto giusto per questo. Ti suggerisco di creare una nuova domanda includendo il tuo codice attuale, mostrando ciò che cerchi di ottenere e dove lotti, o qualcosa del genere. Oh, e * un * argomento per post. Benvenuto in SO, a proposito. :) – Moritz

risposta

5

Sì, è abbastanza semplice. Basta semplicemente toccare un nodo e salvare il buffer in un file.

Sfortunatamente questo significa che è necessario riprodurre attraverso il nodo. Speravo che AVAudioEngine mi permettesse di elaborare un file audio in un altro direttamente, ma a quanto pare è impossibile - devi giocare ed elaborare in tempo reale.

+0

Grazie amico, mi ha aiutato molto. Una cosa, non penso che tu debba giocare se installi il tap sull'audioNode. Non l'ho ancora provato ma in realtà non ne ho bisogno visto che suono comunque l'audio prima di salvarlo. proprio come un controllo di sanità mentale. – mlk

+0

Bene, ci proverò di nuovo, ma nei miei test non sono riuscito a salvare il file senza effettivamente riprodurre i buffer. – matt

1

Rendering offline Ha funzionato per me utilizzando GenericOutput AudioUnit. Per favore controlla questo link, ho mescolato due, tre audio offline e li ho combinati in un singolo file. Non è lo stesso scenario ma potrebbe aiutarti a farti un'idea. core audio offline rendering GenericOutput