9

Desidero registrare video con audio utilizzando AVCaptureSession. Per questo ho bisogno di AudioSessionCategory AVAudioSessionCategoryPlayAndRecord, poiché la mia app riproduce anche i video con audio.AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch

Desidero che l'audio sia udibile dall'altoparlante predefinito e voglio che si mischi con altro audio. Quindi ho bisogno delle opzioni AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers.

Se faccio la seguente mentre altri la riproduzione dell'audio v'è una chiara anomalia udibile l'audio dal altra applicazione:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

Esiste un modo per sbarazzarsi di questo problema tecnico?

Sembra che si verifichi quando c'è un AVAudioSessionRouteChangeReasonRouteConfigurationChange come notificato da AVAudioSessionRouteChangeReasonCategoryChange da nessun ingresso microfonico, all'ingresso mic.

La modifica della configurazione (e glitch) si verifica anche quando l'app passa allo sfondo (con o senza disattivare la sessione audio). Quando si ritorna dallo sfondo senza disattivare la sessione audio, i glitch iniziano a verificarsi quando la configurazione dello AVCaptureSession viene cambiata, cioè quando la telecamera viene commutata dalla parte anteriore a quella posteriore. In questo caso il routing audio non viene toccato e si verifica solo quando si torna dallo sfondo senza disattivare la sessione audio. La notifica che il percorso cambia viene licenziato due volte. Una volta per disabilitare il microfono, e una volta per abilitarlo di nuovo.

Si noti che questo comportamento è facilmente riproducibile scaricando l'esempio AVCamManual di Apple. Aggiungere quanto segue alla viewDidLoad di AAPLCameraViewController.m:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
… 
session.usesApplicationAudioSession = YES; 
session.automaticallyConfiguresApplicationAudioSession = NO; 

Qualche altra cosa strana, che potrebbe essere correlato:

Impostare la categoria audio AVAudioSessionCategoryAmbient prima e attivarlo:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:0 error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

e poi cambia la categoria:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 

altri audio interrompe la riproduzione nonostante il flag di opzioni. Non vengono lanciati errori

+0

Ho tutti gli stessi problemi. Alla lettera. Qualche novità al riguardo? – ancajic

+0

Per l'ultimo esempio in cui l'audio interrompe la riproduzione nonostante il flag delle opzioni. Audio continua a giocare se si disattiva sessione audio ('[[AVAudioSession sharedInstance] setactive: NO withOptions: errore AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation: nil];') prima di impostare la categoria '[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord withOptions: AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error: nil]; '. E riattivare dopo ('[[AVAudioSession sharedInstance] setActive: YES errore: nil];') – ancajic

+0

Avendo anche gli stessi problemi, ho provato a utilizzare 'PlayAndRecord' tutto il tempo: http://stackoverflow.com/questions/35496563/avcapturesession-addinput che causano glitch-in-background-audio. Ho anche provato a lavorare cambiando la categoria da "Ambient" quando inizia la registrazione: http://stackoverflow.com/questions/35615707/avaudiosession-setcategory-not-working. Per favore fatemi sapere se avete trovato una soluzione per entrambi i metodi – Cbas

risposta

0

Come indicato da @Cbas nei commenti, uno Staff Apple ha confermato che c'è un problema tecnico quando si passa da percorsi solo output a input + output e che non vi è alcuna soluzione alternativa a tale problema, una possibile soluzione è evitare del tutto passando da percorsi di sola uscita a quelli di input-output utilizza sempre la categoria AVAudioSessionCategoryPlayAndRecord anche quando l'app non sta registrando. Inoltre, non impostare nuovamente la categoria di sessione audio se è già stata impostata su AVAudioSessionCategoryPlayAndRecord o si verificherà il problema tecnico.

Problemi correlati