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.

È stato utile?

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)];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top