AVAssetWriter / AVAudioPlayer Конфликт? - PullRequest
1 голос
/ 24 июля 2011

Несколько недель назад я разместил эту ветку о проблемах, которые у меня были с AVAssetWriter: AVAssetWriter Woes

Дальнейшие исследования могут привести к конфликту при использовании AVAssetWriter при воспроизведении аудио с AVAudioPlayer или, в действительности, с любой аудиосистемой. Я тоже пробовал с OpenAL.

Вот фон:

  • Использование AVAssetWriter для записи кадров в видео из изображения или набора изображений работает нормально, пока не будет вызвано [AVAudioPlayer play].

  • Это происходит только на устройстве, а не на симе.

  • Ошибка возникает при попытке создать пиксельный буфер из CVPixelBufferPoolCreatePixelBuffer.

  • Как только начинается воспроизведение звука, AVAssetWriterInputPixelBufferAdaptor.pixelBufferPool, который существовал до того, как внезапно станет равным нулю.

Вы можете скачать представительный проект здесь: http://www.mediafire.com/?5k7kqyvtbfdgdgv

Закомментируйте воспроизведение AVAudioPlayer, и оно будет работать на устройстве.

Любые подсказки приветствуются.

Ответы [ 2 ]

0 голосов
/ 19 января 2014

Этот ответ закончен. Не работает Сделайте это вместо

// 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)];
0 голосов
/ 24 июля 2011

Я нашел решение этой проблемы.

Если вы хотите, чтобы AVAudioPlayer и AVAssetWriter вели себя правильно вместе, вы должны иметь и категорию аудио-сеанса, которая является «смешиваемой».

Вы можете использовать смешиваемую категорию, например AVAudioSessionCategoryAmbient.

Однако мне нужно было использовать AVAudioSessionCategoryPlayAndRecord.

Вы можете установить смешиваемость любой категории, выполнив это:

OSStatus propertySetError = 0;

UInt32 allowMixing = true;

propertySetError = AudioSessionSetProperty (
                       kAudioSessionProperty_OverrideCategoryMixWithOthers,  // 1
                       sizeof (allowMixing),                                 // 2
                       &allowMixing                                          // 3
                   );
...