Воспроизведение видео с AVPlayer и запись звука с AVAudioRecorder одновременно

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

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

Как только я соединяю их вместе, запись выбрасывает значения, которые не реагируют на звук, и видео больше не воспроизводится. Кстати, это происходит только на моем устройстве (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?

Спасибо за любую подсказку!

Будьте здоровы, Рафаэль ;)

7
задан Raphael 6 December 2011 в 17:17
поделиться