Выполнить действие после завершения воспроизведения звука в AVAudioPlayer?

StackOverflow https://stackoverflow.com/questions/1111691

Вопрос

Я использую платформу AVAudioPlayer, и у меня есть несколько звуков, которые воспроизводятся по одному.Когда звук закончится, я хочу, чтобы приложение что-то сделало.Я попытался использовать audioPlayerDidFinishPlaying для выполнения действия в конце первого звука, но не смог использовать его для второго звука, потому что получил ошибку переопределения.Могу ли я использовать NSTimeInterval для получения продолжительности звука?

//  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];

}
}
Это было полезно?

Решение

Когда звук закончится, я хочу, чтобы приложение что-то сделало.

Затем назначьте себя делегатом и ответьте на audioPlayerDidFinishPlaying:successfully:.

В показанном вами фрагменте кода вы выполнили шаг 2, но не шаг 1:Вы не назначаете себя делегатом.

Я пытался использовать applicationDidFinishLaunching совершить действие в конце первого звука…

Мозговой пердеж?Насколько я понимаю, этот метод не имеет ничего общего с воспроизведением звуков.

…, но я не смог использовать это для второго звука, потому что получил ошибку переопределения.

Хм?Вы реализовали метод дважды или что-то в этом роде вместо того, чтобы просто сравнивать объект игрока в теле метода?

Было бы полезно, если бы вы показали точное сообщение об ошибке, которое получили.

Другие советы

Свифт 3:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("sound file finished")
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top