2012-06-11 6 views
8

Sto scrivendo un'app in cui sto cercando di cambiare il tono dell'audio quando sto registrando un filmato (.m4v). O modificando successivamente il tono audio del film. Voglio che il risultato finale sia un filmato (.m4v) che abbia la lunghezza originale (cioè lo stesso visual dell'originale) ma con una tonalità del suono modificata, ad es. una "chipmunk voice". Una conversione in tempo reale è preferibile se possibile.Modifica l'intonazione audio della clip registrata (m4v)

Ho letto molto sul cambiamento del pitch audio in iOS, ma la maggior parte degli esempi si concentra sulla riproduzione, ovvero il suono con un tono diverso.

Nella mia app sto registrando un film (.m4v/AVFileTypeQuickTimeMovie) e salvandolo utilizzando AVAssetWriter standard. Quando si salva il film Ho l'accesso ai seguenti elementi in cui ho cercato di manipolare l'audio (ad esempio modificare il pitch):

  • buffer audio (CMSampleBufferRef)
  • scrittore ingresso audio (AVAssetWriterAudioInput)
  • ingresso audio opzioni writer (ad esempio AVNumberOfChannelsKey, AVSampleRateKey, AVChannelLayoutKey)
  • patrimoniale scrittore (AVAssetWriter)

ho cercato di agganciare negli oggetti di cui sopra per modificare l'aud io passo, ma senza successo.

Ho anche provato con Dirac, come descritto qui: Real Time Pitch Change In iPhone Using Dirac
E OpenAL con AL_PITCH come descritto qui: Piping output from OpenAL into a buffer
E la biblioteca "BASS" da un4seen: Change Pitch/Tempo In Realtime

non ho trovato il successo con una qualsiasi delle librerie precedenti, molto probabilmente perché non so davvero come usarle e dove collegarle al codice di salvataggio dell'audio.

Sembra esserci un sacco di librerie che hanno effetti simili ma si concentra sulla riproduzione o sul codice di registrazione personalizzato. Voglio manipolare il flusso audio che ho già ricevuto (AVAssetWriterAudioInput) o modificare il clip filmato salvato (.m4v). Voglio che il video non sia modificato visivamente, cioè giocato alla stessa velocità. Ma voglio che l'audio vada più veloce (come un chipmunk) o più lento (come un ... mostro?

Hai qualche suggerimento su come posso modificare il tono in tempo reale (quando registri il film) o dopo convertendo l'intero filmato (file .m4v)? Devo esaminare ulteriormente Dirac, OpenAL, SoundTouch, BASS o qualche altra libreria?

Voglio poter condividere il film con altri con audio modificato, questo è il motivo Non posso fare affidamento sulla modifica del pitch solo per la riproduzione

risposta

3

Ok, posso tranquillamente dire che dirac farà definitivamente il trucco, l'ho usato e funziona

Non ho molta esperienza con l'elaborazione video, ma se in qualche momento è possibile isolare la traccia audio è un gioco da ragazzi.

  1. se si può fare, poi basta salvarlo in un file e utilizzare il codice di esempio di Dirac in tempo stretching, ma non lo dice, ma anche non pitch shifting, è possibile impostare tre parametri per trasformare l'audio (fattore di allungamento del tempo, pitch shifting in centesimi/toni * e anche cambio di formante).

  2. se non hai voglia di salvarlo in un file, allora basta convertirlo in PCM e fare un po 'di DSP su Audio Units. per essere onesti, è necessario disporre di una seria conoscenza della matematica e dell'elaborazione audio per farlo, ma ci sono un sacco di buoni progetti di esempio (github (AudioGraph di Tom Zic)) che ti forniranno ciò di cui hai bisogno, non dimenticarti di menziona tutti i codici degli sviluppatori sul tuo lavoro.

Inoltre, se è possibile trasformare in PCM, in questa fase è possibile applicare alternativamente dirac all'audio compresso o vivere sul grafico unità audio o utilizzando il codice di esempio, invece di utilizzare l'EAFReader Dirac utilizza, appena passato i dati del buffer al buffer che utilizza per eseguire il pitch shift. potreste aver bisogno di fare un po 'di magia lì, ma non così drammatico come scrivere la vostra implementazione DSP del pitch shifting.

Linea di fondo, se si può chiedere AVFoundation per prendersi cura del video solo allora si può fare le unità audio dal vivo la lavorazione e impostare una richiamata in modo ogni volta che si elabora esso è possibile passare i dati elaborati in un file o probabilmente per voi avassetwriter, non sono sicuro se questo ultimo pezzo sia possibile. Se non è possibile, allora la soluzione è sincronizzare e salvare video e audio separatamente, anche se posso immaginare che sia un problema enorme dato che entrambi cercheranno di scrivere su disco allo stesso tempo. Per favore fatemi sapere come va, sono incuriosito ora.

1
  • prima cosa che devi fare è demux audio dal flusso mp4. Avrai bisogno di un demultiplexer (demuxer in breve) per raggiungere questo obiettivo. Date un'occhiata a MainConcept SDKs, supportano un sacco di formati.
  • In secondo luogo è necessario decodifica l'audio compresso da qualsiasi formato essa sia, in formato raw PCM.
  • Quindi utilizzare una libreria per pitch shift l'audio non elaborato.
  • Dopodiché è necessario codificare audio pitch-shifted di nuovo al formato compresso.
  • E mux indietro in mp4.

Perdendo parte della qualità audio nel processo a causa della decodifica-codifica. Il tuo video rimarrà lo stesso.

Problemi correlati