Воспроизведение видео с AVPlayer и запись звука с AVAudioRecorder одновременно - PullRequest
7 голосов
/ 06 декабря 2011

Я много дней гуглял эту проблему, но не нашел решения для своей простой проблемы.

Я пытаюсь воспроизвести видео во время записи звука. Запись звука отлично работает без видео. И видео отлично работает без записи.

Как только я соединил оба, запись выдает значения, которые не реагируют на звук, и видео больше не воспроизводится. Кстати это происходит только на моем устройстве (iPhone 4 / iOS5). В симуляторе все отлично работает.

Это уменьшенная версия моего кода в ViewController.

// Audio Recorder

NSURL *nullUrl = [NSURL fileURLWithPath:@"/dev/null"];

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat:44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt:kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt:1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt:AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];

NSError *recorderError;
_recorder = [[AVAudioRecorder alloc] initWithURL:nullUrl settings:settings error:&recorderError];

if (_recorder)
{
    [_recorder prepareToRecord];
    _recorder.meteringEnabled = YES;
    [_recorder record];

    _levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
}


// Video Player

NSURL *url = [[NSBundle mainBundle] URLForResource:@"Video"
                                      withExtension:@"mp4"
                                       subdirectory:nil];

_avPlayer = [[AVPlayer playerWithURL:url] retain];
_avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:_avPlayer] retain];

_avPlayerLayer.frame = self.view.layer.bounds;
[self.view.layer addSublayer:_avPlayerLayer];

[_avPlayer play];

Рекордер просто выводит значение, которое читается в методе levelTimerCallback. Видео просто воспроизводит короткое видео.

Я понял, что должен установить категорию для AVAudioSession. Если я реализую этот код после запуска приложения, видео воспроизводится, но рекордер по-прежнему выводит те же значения, не реагируя на звук.

NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[audioSession setActive:YES error:&error];

Я мог бы представить, что мне, возможно, придется что-то делать с AudioSessionSetProperty

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

Но это ничего не меняет. У вас есть идея, что мне не хватает или как правильно настроить AudioSession?

Спасибо за каждый намек на это!

Ура, Рафаэль;)

1 Ответ

13 голосов
/ 09 декабря 2011

У меня была такая же проблема (за исключением того, что я использую AVPlayer для воспроизведения аудио, а не видео).Я предлагаю вам начать прослушивать изменения аудио-маршрутизации, и вы увидите изменение маршрута несколько раз, когда AVPlayer и AVAudioRecorder запускаются одновременно.

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                                audioRouteChangeListenerCallback,
                                self);

В обратном вызове распечатайте категорию и маршрут (kAudioSessionProperty_AudioRoute).Единственный способ заставить воспроизведение аудио и запись работать одновременно, это если:

  1. Аудиосеанс был AVAudioSessionCategoryPlayAndRecord, а свойство kAudioSessionProperty_OverrideCategoryMixWithOthers было истинным.1011 * Я начал воспроизведение перед записью.После вызова AVAudioRecorder prepareToRecord не начинайте запись, пока не получите изменение аудио маршрута.Несмотря на то, что это не дает сбоя, если вы начинаете запись раньше, изменение аудио маршрута, кажется, приводит к сбою записи.

Я пробовал другие комбинации, но это единственная, которая работает каждый раз.

...