Führen Sie eine Aktion aus, wenn ein Ton beendet hat in AVAudioPlayer zu spielen?
-
12-09-2019 - |
Frage
Ich bin mit dem AVAudioPlayer Rahmen, und ich habe mehrere Töne, die einen nach dem anderen spielen. Wenn ein Ton fertig abgespielt wird, möchte ich die Anwendung etwas zu tun. Ich habe versucht, audioPlayerDidFinishPlaying zu verwenden, um die Aktion am Ende des ersten Ton zu tun, aber ich konnte sie nicht für den zweiten Ton verwenden, weil ich eine Neudefinition Fehler bekam. Kann ich NSTimeInterval verwenden, um die Dauer eines Sound zu bekommen?
// 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];
}
}
Lösung
Wenn ein Soundwiedergabe beendet ist, möchte ich die Anwendung etwas zu tun.
Dann setzen Sie sich als Delegierter und reagieren auf audioPlayerDidFinishPlaying:successfully:
.
Im Code-Snippet Sie zeigte, Sie 2 Schritt getan haben, aber nicht Schritt 1:. Sie sind nicht selbst als Delegierter Einstellung
Ich habe versucht,
applicationDidFinishLaunching
zu verwenden, um die Aktion am Ende des ersten Ton zu tun ...
Gehirn fart? Diese Methode hat nichts, was ich sehen kann, mit Spiel Klang zu tun.
..., aber ich konnte das nicht für den zweiten Ton verwenden, weil ich einen Neudefinition Fehler bekam.
Hä? Haben Sie die Methode implementieren zweimal oder etwas anstatt nur das Spielerobjekt in dem Verfahren Körper zu vergleichen?
Es würde helfen, wenn Sie die genaue Fehlermeldung zeigen Ihnen.
Andere Tipps
Swift 3:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
print("sound file finished")
}