Lecture vidéo avec AVPlayer et enregistrement sonore avec AVAudioRecorder simultanément

j'ai cherché ce problème sur Google pendant de nombreux jours, mais je n'ai pas trouvé de solution pour mon simple problème.

j'essaie de jouer une vidéo en enregistrant du son. Enregistrement sonore fonctionne très bien sans la vidéo. Et la vidéo fonctionne bien sans l'enregistrement.

dès que j'ai assemblé les deux, l'enregistrement jette des valeurs qui ne réagissent pas sur le son et la vidéo ne joue plus. Par la façon dont cela se produit uniquement sur mon appareil (iPhone 4 / iOS5). Dans le simulateur tout fonctionne bien.

c'est une version réduite de mon code qui est dans un 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];

l'enregistreur affiche simplement une valeur lue dans la méthode levelTimerCallback. La vidéo joue simplement une courte vidéo.

je me suis rendu compte que je dois définir une catégorie pour L'AVAudioSession. Si j'implémente ce code après le démarrage de l'application, la vidéo est en lecture mais l'enregistreur affiche toujours la même valeurs sans réagir au son.

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

je pourrais imaginer que je pourrais avoir à faire quelque chose avec AudioSessionSetProperty

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

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

mais ça ne change rien. Avez-vous une idée de ce que je manque ou comment organiser l'Audition correctement?

Merci de tout soupçon!

santé, Raphaël;)

7
demandé sur Raphael 2011-12-06 21:17:50

1 réponses

j'ai eu le même problème (sauf que J'utilise L'AVPlayer pour lire l'audio et pas la vidéo). Je vous suggère de commencer à écouter les changements de routage audio et vous verrez le changement de route plusieurs fois lorsque AVPlayer et AVAudioRecorder sont lancés en même temps.

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                                audioRouteChangeListenerCallback,
                                self);

dans le rappel Imprimer la catégorie et la route (kAudioSessionProperty_AudioRoute). La seule façon que j'ai pu obtenir la lecture audio et l'enregistrement pour fonctionner simultanément était si:

  1. la session audio était AVAudioSessionCategoryPlayAndRecord et kaudiosessionproperty_overridecategorymixwithother property was true.

  2. j'ai lancé la lecture avant l'enregistrement. Après AVAudioRecorder preparetrecord est appelé, ne commencez pas l'enregistrement jusqu'à ce que vous obtenez le changement de route audio. Bien qu'il n'échoue pas si vous commencez à enregistrer plus tôt, le changement de route audio semble faire l'enregistrement de l'échec.

j'ai essayé d'autres combinaisons, mais c'est le seul qui fonctionne à chaque fois.

13
répondu user1088810 2011-12-10 20:41:37