MPMoviePlayerController hace que el resto del audio sea suave (después de que finalice MP)

Tengo una aplicación que reproduce música de fondo, cuando se presiona un botón determinado, se abre una nueva vista con el controlador de navegación. Esa nueva vista tiene un MPMoviePlayerController y un AVCaptureSession con una AudioSession compartida. Después de descartar esa vista, el sonido de fondo es muy suave en comparación con cómo era. ¿Qué es lo que hace que el volumen sea tan bajo después de tocar?

NSError* error4 = nil;
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error4]) {
    NSLog(@"AVAudioSession setCategory failed: %@", [error4 localizedDescription]);
}

// Set audio session property "allow mixing" to true so audio can be recorded while it is playing
UInt32 allowMixing = true;
OSStatus status = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
if (status != kAudioSessionNoError) {
    NSLog(@"AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers) failed: %ld", status);
}

// Activate the audio session
error4 = nil;
if (![audioSession setActive:YES error:&error4]) {
    NSLog(@"AVAudioSession setActive:YES failed: %@", [error4 localizedDescription]);
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];

NSString *proud = [[documentsDirectoryPath stringByAppendingPathComponent:@"imissyou"] stringByAppendingPathComponent:selectedCountry];

NSURL  *movieURL = [[NSURL fileURLWithPath:proud] retain];
player =

[[MPMoviePlayerController alloc] initWithContentURL: movieURL];
player.useApplicationAudioSession=YES;

[player prepareToPlay];
player.controlStyle = MPMovieControlStyleNone;
player.allowsAirPlay = NO;
player.scalingMode = MPMovieScalingModeFill;   

player.view.frame = self.view.frame;

[self.view insertSubview:player.view belowSubview:vImagePreview];

[player setFullscreen:YES animated:YES];

// ...

[[NSNotificationCenter defaultCenter] 
 addObserver:self
 selector:@selector(movieFinishedCallback:)
 name:MPMoviePlayerPlaybackDidFinishNotification
 object:player];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:player];


[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayerWillExitFullscreen:)
                                             name:MPMoviePlayerWillExitFullscreenNotification
                                           object:player];


[player play];


session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
session.sessionPreset = AVCaptureSessionPresetMedium;

CALayer *viewLayer = self.vImagePreview.layer;
NSLog(@"viewLayer = %@", viewLayer);

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
[captureVideoPreviewLayer setCornerRadius:14];
[captureVideoPreviewLayer setBorderWidth:3.0];
[captureVideoPreviewLayer setBorderColor:[[UIColor whiteColor] CGColor]];
[[vImagePreview layer] setCornerRadius:14];


[[vImagePreview layer] setBorderWidth:3.0];


[[vImagePreview layer] setBorderColor:[[UIColor whiteColor] CGColor]];

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];
[captureVideoPreviewLayer release];
AVCaptureDevice *device = [self frontFacingCameraIfAvailable];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (!input) {
    // Handle the error appropriately.
    NSLog(@"ERROR: trying to open camera: %@", error);
}

AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
NSError *error2 = nil;
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error2];






AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];

NSString *archives = [documentsDirectoryPath stringByAppendingPathComponent:@"archives"];
NSString *editedfilename = [[selectedCountry lastPathComponent] stringByDeletingPathExtension];
NSString *datestring = [[editedfilename stringByAppendingString:@" "] stringByAppendingString:currentTime];
NSLog(@"%@", datestring);
NSString *outputpathofmovie = [[archives stringByAppendingPathComponent:datestring] stringByAppendingString:@".mp4"];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie];
[session addInput:input];
[session addInput:audioInput];
[session addOutput:movieFileOutput];
[session commitConfiguration];
[session startRunning];
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
[movieURL release];
[outputURL release];

preguntado el 03 de mayo de 12 a las 21:05

2 Respuestas

La sesión de audio puede estar "esquivando" la música de fondo. Es posible que desee establecer la propiedad "kAudioSessionProperty_OtherMixableAudioShouldDuck" en falso para deshabilitarla.

contestado el 03 de mayo de 12 a las 22:05

¿Cómo hago para cambiar de propiedad? Agregué esto al código: OSStatus propertySetError = 0; UInt32 allowMixing = true; propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing); ¿Y puedo usar esto mientras sigo usando OverrideCategoryMixWithOthers? - user717452

cambie allowMixing = false; Creo que puedes usarlo con la otra propiedad, ya que solo le dice qué hacer cuando se mezcla, pero no estoy seguro. - rooster117

No funcionó, arruinó la grabación que estaba haciendo AVCaptureSession y aún tenía el audio casi silenciado después de que terminó. - user717452

mmm. Bueno, definitivamente suena como si se estuviera esquivando ya que recientemente usé esa función. Otra sugerencia sería buscar en la propiedad useApplicationAudioSession que forma parte de MPMovieController. De forma predeterminada, está configurado en SÍ, pero no sé si esto también va a romper otras cosas. (editar) nm Veo que ya lo tienes configurado en sí - rooster117

Lo tengo resuelto ahora. Tenía la categoría establecida en PlayAndRecord. Lo cambié a Ambient (que también permite grabar audio mientras se reproduce audio) y eliminé la propiedad de OverrideCategoryMixWithOthers, dejando solo la parte de atenuación, y establecí el valor de allowmixing en verdadero, y ahora todo funciona en conjunto. - user717452

Lo tengo resuelto ahora. Tenía la categoría establecida en PlayAndRecord. Lo cambié a Ambient (que también permite grabar audio mientras se reproduce audio) y eliminé la propiedad de OverrideCategoryMixWithOthers, dejando solo

OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 
propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing);

contestado el 04 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.