sonido sonar silencio rastrear por plus otro localizar hacer google encontrar emitir con como celular casa bloqueo iphone cocoa-touch nsdate avaudioplayer

iphone - sonar - ¿Hacer una acción cuando un sonido ha terminado de reproducirse en AVAudioPlayer?



localizar iphone por gps (2)

Estoy usando el marco AVAudioPlayer y tengo varios sonidos que se reproducen uno a la vez. Cuando un sonido termina de reproducirse, quiero que la aplicación haga algo. Intenté usar audioPlayerDidFinishPlaying para realizar la acción al final del primer sonido, pero no pude usar eso para el segundo sonido porque obtuve un error de redefinición. ¿Puedo usar NSTimeInterval para obtener la duración de un sonido?

// ViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVAudioPlayer.h> @interface ViewController : UIViewController { UIButton *begin; UIWindow *firstTestWindow; UIWindow *secondTestWindow; AVAudioPlayer *player; NSTimeInterval duration; } @property (nonatomic, retain) IBOutlet UIButton *begin; @property (nonatomic, retain) IBOutlet UIWindow *firstTestWindow; @property (nonatomic, retain) IBOutlet UIWindow *secondTestWindow; @property (nonatomic, retain) AVAudioPlayer *player; @property (readonly) NSTimeInterval duration; - (IBAction)begin:(id)sender; - (IBAction)doTapScreen:(id)sender; @end //ViewController.m #import "ViewController.h" @implementation ViewController @synthesize begin, player, firstTestWindow, secondTestWindow; //first sound - (IBAction)begin:(id)sender; { [firstTestWindow makeKeyAndVisible]; NSString *soundFilePath = [[NSBundle mainBundle] pathForResource: @"Tone1" ofType: @"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil]; [fileURL release]; self.player = newPlayer; [newPlayer release]; [player prepareToPlay]; [self.player play]; } //If user does not do anything by the end of the sound go to secondWindow - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag { if (flag==YES) { [secondWindow makeKeyAndVisible]; } } //second sound - (IBAction)doTapScreen:(id)sender { //When user touches the screen, either play the sound or go to the next window if (self.player.playing) { [self.player stop]; [thirdWindow makeKeyAndVisible]; } else { NSString *soundFilePath = [[NSBundle mainBundle] pathForResource: @"Tone2" ofType: @"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil]; [fileURL release]; self.player = newPlayer; [newPlayer release]; [player prepareToPlay]; [self.player play]; } }


Cuando un sonido termina de reproducirse, quiero que la aplicación haga algo.

A continuación, establezca como delegado y responda a audioPlayerDidFinishPlaying:successfully:

En el fragmento de código que mostró, ha realizado el paso 2 pero no el paso 1: no se está estableciendo como delegado.

Intenté usar applicationDidFinishLaunching para realizar la acción al final del primer sonido ...

¿Pedo cerebral? Ese método no tiene nada que ver con los sonidos de reproducción.

..., pero no pude usar eso para el segundo sonido porque obtuve un error de redefinición.

Eh ¿Implementó el método dos veces o algo en lugar de simplemente comparar el objeto del jugador en el cuerpo del método?

Te ayudaría si mostraras el mensaje de error exacto que recibiste.


Swift 3:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { print("sound file finished") }