ruidos ruido quitar programa para online maker grabaciones fondo eliminar como arreglar objective-c ios7 core-audio avaudioplayer avplayer

objective-c - quitar - programa para eliminar ruidos de grabaciones de audio



iOS 7 SDK no respeta el audio de fondo (5)

He investigado mucho, tanto en Google como en StackOverflow. Todas las respuestas que encontré no funcionan en iOS 7. Comencé a escribir una aplicación nueva en iOS 7 SDK con Xcode 5.

Todo lo que estoy tratando de hacer es reproducir el audio en la aplicación desde un archivo almacenado en el paquete de la aplicación (no desde la biblioteca de Música). Quiero que el audio se reproduzca en segundo plano y se controle cuando la pantalla está bloqueada (además de Control Center).

Configuré la clave APPNAME-Info.plist , UIBackgroundModes , en audio . No está manejando las cosas en el delegado de la aplicación; Todo se hace dentro del ViewController.

@interface ViewController : UIViewController <AVAudioPlayerDelegate>

Dentro del viewDidAppear: la implementación viewDidAppear: método que llamo super y luego el siguiente código:

// Once the view has loaded then we can register to begin receiving controls and we can become the first responder [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder];

En el método viewWillDisappear: mi implementación, tengo el siguiente código:

// End receiving events [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder];

También he implementado el método canBecomeFirstResponder , que devuelve YES . A continuación, implementé el método remoteControlReceivedWithEvent: :

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { // If it is a remote control event handle it correctly if (event.type == UIEventTypeRemoteControl) { if (event.subtype == UIEventSubtypeRemoteControlPlay) { [self playPauseAudio:self]; } else if (event.subtype == UIEventSubtypeRemoteControlPause) { [self playPauseAudio:self]; } else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause) { [self playPauseAudio:self]; } } }

Lo que me confunde es que esta misma configuración funcionó bien en iOS 6. En iOS 7, no funciona. Solía ​​ser tan fácil en iOS 6. Algo fundamentalmente cambiado en iOS 7 SDK. ¿Qué me estoy perdiendo?


Al parecer, el problema estaba en el lado de Apple, ya que la actualización 7.0.3 de iOS soluciona este problema. Además de lo que Alex notó sobre UIEventSubtype, el código que funcionó en iOS6 ahora funciona en iOS7.

Para completar, aquí está mi código relevante que funciona tanto en iOS6 como en iOS7, después de la actualización a 7.0.3. También se incluyeron AVFoundation.framework y MediaPlayer.framework en las fases de compilación del proyecto -> Vincular binarios con bibliotecas. No hay código para esto en el delegado de la aplicación.

En el archivo .h de viewcontroller:

#import <AVFoundation/AVFoundation.h> #import <MediaPlayer/MediaPlayer.h> @interface NewsDetailViewController : UIViewController <UIWebViewDelegate, AVAudioSessionDelegate> @property (nonatomic) MPMoviePlayerController *audioPlayer;

En el archivo .m de viewcontroller:

- (void)viewDidLoad { [super viewDidLoad]; self.audioPlayer = [[MPMoviePlayerController alloc] initWithContentURL:audioUrl]; [self.audioPlayer prepareToPlay]; [self.audioPlayer.view setFrame:CGRectMake(0, 0, self.audioView.frame.size.width, 42)]; self.audioPlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth; [self.audioView addSubview:self.audioPlayer.view]; [self.audioPlayer play]; NSError *setCategoryError = nil; NSError *activationError = nil; [[AVAudioSession sharedInstance] setActive:YES error:&activationError]; [[AVAudioSession sharedInstance] setDelegate:self]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; } - (BOOL)canBecomeFirstResponder { return YES; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } - (void)viewWillDisappear:(BOOL)animated { [self.audioPlayer stop]; [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder]; [super viewWillDisappear:animated]; } - (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlPlay: [self.audioPlayer play]; break; case UIEventSubtypeRemoteControlPause: [self.audioPlayer pause]; break; case UIEventSubtypeRemoteControlTogglePlayPause: if (self.audioPlayer.playbackState == MPMoviePlaybackStatePlaying) { [self.audioPlayer pause]; } else { [self.audioPlayer play]; } break; default: break; } } }


Como también me interesa encontrar esta solución, agregaré más información de mi lado.

Estoy experimentando el mismo problema, pero todavía la documentación de Apple no ha cambiado acerca de la administración de eventos de control remoto.

Intenté mover algunas cosas y sucedió algo interesante.

Originalmente tuve la gestión de eventos de control remoto en mi controlador TabBar. Ahora que moví todo en el controlador de vista del reproductor, puedo ver que puedo controlar nuevamente la reproducción de música con mis auriculares, pero no con los botones del nuevo panel de control de iOS7 (el que viene de la parte inferior de la pantalla).

Esto es bastante raro.

Para resolver el problema, intentemos enriquecer el hilo con nuestra prueba.


Me las arreglé para resolver esto, y para salvar el pelo tirado por otra pobre alma aquí va:

En primer lugar, asegúrese de que su lista de información muestre correctamente el audio como modo de fondo.

(Si no sabe de qué estoy hablando, seleccione YOURAPPNAME-Info.plist seleccione eso. Haga clic en el signo más y agregue una nueva clave llamada UIBackgroundModes y expándala. Agregue un valor llamado audio ).

Necesitará una referencia a cualquier objeto de reproducción que esté creando el audio. Ya que solo estoy reproduciendo audio y AVplayer no estaba cumpliendo con el audio de fondo, use esto en el encabezado de su controlador de vista:

@property (nonatomic, retain) MPMoviePlayerController *audioPlayer;

En la implementación, haga lo siguiente:

[super viewDidAppear:animated]; //Once the view has loaded then we can register to begin recieving controls and we can become the first responder [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder];

y

- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //End recieving events [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder];

agrega dos métodos

//Make sure we can recieve remote control events - (BOOL)canBecomeFirstResponder { return YES; } - (void) registerForAudioObjectNotifications { NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; [notificationCenter addObserver: self selector: @selector (handlePlaybackStateChanged:) name: MixerHostAudioObjectPlaybackStateDidChangeNotification object: audioObject]; }

ahora TODO el código importante: esto permite que su aplicación controle el audio desde el "centro de control" y desde la pantalla de bloqueo:

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: [self playOrStop: nil]; break; default: break; } } }

Puede agregar muchos tipos de eventos aquí y llamar a cualquier método.

Los eventos típicos son:

UIEventSubtypeRemoteControlPlay = 100, //Parent EVENT // All below are sub events and you can catch them using switch or If /else. UIEventSubtypeRemoteControlPause = 101, UIEventSubtypeRemoteControlStop = 102, UIEventSubtypeRemoteControlTogglePlayPause = 103, UIEventSubtypeRemoteControlNextTrack = 104, UIEventSubtypeRemoteControlPreviousTrack = 105, UIEventSubtypeRemoteControlBeginSeekingBackward = 106, UIEventSubtypeRemoteControlEndSeekingBackward = 107, UIEventSubtypeRemoteControlBeginSeekingForward = 108, UIEventSubtypeRemoteControlEndSeekingForward = 109,

Para depurar la ayuda puedes usar:

MPMoviePlayerController *mp1= (MPMoviePlayerController *)[notification object]; NSLog(@"Movie State is: %d",[mp1 playbackState]); switch ([mp1 playbackState]) { case 0: NSLog(@"******* video has stopped"); break; case 1: NSLog(@"******* video is playing after being paused or moved."); break; case 2: NSLog(@"******* video is paused"); break; case 3: NSLog(@"******* video was interrupted"); break; case 4: NSLog(@"******* video is seeking forward"); break; case 5: NSLog(@"******* video is seeking Backwards"); break; default: break;

y eso es todo, espero que ayude a alguien por ahí! - Esto funciona perfectamente en iOS 7 y iOS 6 con la aplicación Storyboard, así como también el control mediante el uso de auriculares y todo el nuevo centro de control.


Si también desea reproducir audio en segundo plano en iphone y simulador, debe escribir este código en plist y, en primer lugar, asegurarse de que Info.plist muestre correctamente el audio como modo de fondo.

(Si no sabe de qué estoy hablando, seleccione YOURAPPNAME-Info.plist seleccione eso. Haga clic en el signo más y escriba una clave UIBackgroundModes e ingrese. Agregue un valor llamado "La aplicación reproduce el audio" (para el simulador) o "La aplicación juega audio o transmite audio / video usando AirPlay "(para iphone).

en AppDelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application { __block UIBackgroundTaskIdentifier task = 0; task=[application beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]); [application endBackgroundTask:task]; task=UIBackgroundTaskInvalid; }]; }

Agregue estos dos marcos en su proyecto y alguna línea de código en ViewController.h

#import <AVFoundation/AVFoundation.h> #import <MediaPlayer/MediaPlayer.h> @interface ViewController : UIViewController <UIWebViewDelegate, AVAudioSessionDelegate> @property (nonatomic) MPMoviePlayerController *audioPlayer;

Recuerde que estas referencias de marcos deben agregarse a su proyecto.

Luego en Viewcontrller.m

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } - (void)viewWillDisappear:(BOOL)animated { [self.audioPlayer stop]; [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder]; [super viewWillDisappear:animated]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSURL *audioUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"songName" ofType:@"mp3"]]; self.audioPlayer = [[MPMoviePlayerController alloc] initWithContentURL:audioUrl]; [self.audioPlayer prepareToPlay]; [self.audioPlayer.view setFrame:CGRectMake(0, 0, self.view.frame.size.width-100, 42)]; self.audioPlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth; [self.view addSubview:self.audioPlayer.view]; [self.audioPlayer play]; // for run application in background NSError *setCategoryError = nil; NSError *activationError = nil; [[AVAudioSession sharedInstance] setActive:YES error:&activationError]; [[AVAudioSession sharedInstance] setDelegate:self]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; }

Espero que también te ayude a reproducir audio en segundo plano en iphone y simulador.


Una cosa a tener en cuenta que es diferente de iOS6 a iOS7 con eventos de control remoto es que en iOS6 los eventos de reproducción / pausa vinieron como un UIEventSubtype :
UIEventSubtypeRemoteControlTogglePlayPause
Y en iOS7 vienen como dos subtipos separados:
UIEventSubtypeRemoteControlPause
UIEventSubtypeRemoteControlPlay