AVAssetWriter / AVAudioPlayer conflitto?
-
25-10-2019 - |
Domanda
Settimane fa, ho postato questa discussione per quanto riguarda problemi che ho avuto con AVAssetWriter: AVAssetWriter guai
Ulteriori ricerche sembra portare ad un conflitto con AVAssetWriter durante la riproduzione audio con AVAudioPlayer o, in realtà, qualsiasi sistema audio. Ho provato con OpenAL pure.
Ecco il fondo:
-
Utilizzo AVAssetWriter di fotogrammi di scrittura ad un video da un'immagine o un set di immagini funziona bene fino a [play AVAudioPlayer] si chiama.
-
Ciò accade solo sul dispositivo, non il sim.
-
L'errore si verifica quando si tenta di creare un buffer di pixel da CVPixelBufferPoolCreatePixelBuffer.
-
Una volta avviata la riproduzione audio, l'AVAssetWriterInputPixelBufferAdaptor.pixelBufferPool che esisteva prima diventa suddely nullo.
È possibile scaricare il progetto rappresentante qui: http://www.mediafire.com/?5k7kqyvtbfdgdgv
come commento AVAudioPlayer gioco e funzionerà sul dispositivo.
Eventuali indizi sono apprezzati.
Soluzione
ho trovato la soluzione a questo problema.
Se si desidera avere AVAudioPlayer e AVAssetWriter si comportano correttamente insieme, è necessario avere e categoria sessione audio che è 'miscelabile'.
È possibile utilizzare una categoria che è miscelabile come AVAudioSessionCategoryAmbient.
Tuttavia, ho bisogno di usare AVAudioSessionCategoryPlayAndRecord.
È possibile impostare qualsiasi categoria di essere miscelabili mediante l'attuazione di questo:
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty (
kAudioSessionProperty_OverrideCategoryMixWithOthers, // 1
sizeof (allowMixing), // 2
&allowMixing // 3
);
Altri suggerimenti
Questa risposta di cui sopra è in completa. Non funziona. Fate questo invece
// Setup to be able to record global sounds (preexisting app sounds)
NSError *sessionError = nil;
if ([[AVAudioSession sharedInstance] respondsToSelector:@selector(setCategory:withOptions:error:)])
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDuckOthers error:&sessionError];
else
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
// Set the audio session to be active
[[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
//then call your asset writer
movieWriter = [[AVAssetWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];