Iphone 当声音在AVAudioPlayer中播放完毕时,是否执行操作?

Iphone 当声音在AVAudioPlayer中播放完毕时,是否执行操作?,iphone,cocoa-touch,nsdate,avaudioplayer,Iphone,Cocoa Touch,Nsdate,Avaudioplayer,我使用的是AVAudioPlayer框架,我有几个声音一次播放一个。当声音播放完毕后,我希望应用程序能做些什么。我尝试使用AudioPlayerDifinishPlay在第一个声音结束时执行操作,但在第二个声音中无法使用,因为我遇到了重新定义错误。我可以使用NSTimeInterval获取声音的持续时间吗 // ViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> #

我使用的是AVAudioPlayer框架,我有几个声音一次播放一个。当声音播放完毕后,我希望应用程序能做些什么。我尝试使用AudioPlayerDifinishPlay在第一个声音结束时执行操作,但在第二个声音中无法使用,因为我遇到了重新定义错误。我可以使用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];

}
}
//ViewController.h
#进口
#进口
#进口
@界面ViewController:UIViewController{
ui按钮*开始;
UIWindow*第一个测试窗口;
UIWindow*第二个测试窗口;
AVAudioPlayer*播放器;
NSTimeInterval持续时间;
}  
@属性(非原子,保留)IBUIButton*开始;
@属性(非原子,保留)IBUIWindow*firstTestWindow;
@属性(非原子,保留)IBUIWindow*secondTestWindow;
@属性(非原子,保留)AVAudioPlayer*玩家;
@属性(只读)NSTimeInterval持续时间;
-(iAction)开始:(id)发送方;
-(iAction)doTapScreen:(id)发送方;
@结束
//ViewController.m
#导入“ViewController.h”
@实现视图控制器
@综合开始,玩家,第一个测试窗口,第二个测试窗口;
//第一声
-(iAction)开始:(id)发送方;{
[firstTestWindow makeKeyAndVisible];
NSString*声音文件路径=
[[NSBundle mainBundle]路径资源:@“Tone1”
类别:@“mp3”];
NSURL*fileURL=[[NSURL alloc]initFileURLWithPath:soundFilePath];
AVAudioPlayer*新玩家=
[[AVAudioPlayer alloc]initWithContentsOfURL:fileURL
错误:无];
[fileURL发布];
self.player=newPlayer;
[新玩家发布];
[玩家准备玩];
[self.player play];
}
//如果用户在声音结束时未执行任何操作,请转到第二个窗口
-(无效)AudioPlayerIDfinishPlaying:(AVAudioPlayer*)播放器
成功:(BOOL)标志{
如果(标志==是){
[Second Window makeKeyAndVisible];
}
}
//第二声
-(iAction)点屏幕:(id)发送者{
//当用户触摸屏幕时,播放声音或转到下一个窗口
if(self.player.playing){
[self.player-stop];
[thirdWindow makeKeyAndVisible];
}
否则{
NSString*声音文件路径=
[[NSBundle mainBundle]路径用于资源:@“Tone2”
类别:@“mp3”];
NSURL*fileURL=[[NSURL alloc]initFileURLWithPath:soundFilePath];
AVAudioPlayer*新玩家=
[[AVAudioPlayer alloc]initWithContentsOfURL:fileURL
错误:无];
[fileURL发布];
self.player=newPlayer;
[新玩家发布];
[玩家准备玩];
[self.player play];
}
}
当声音播放完毕后,我希望应用程序能做些什么

然后将自己设置为代理,并响应
AudioPlayerIDfinishPlaying:successfully:

在您展示的代码片段中,您已经完成了步骤2,但没有完成步骤1:您没有将自己设置为代理

我尝试使用
applicationdFinishLaunching
在第一个声音结束时执行操作

大脑放屁?我看不出这种方法和播放声音有什么关系

…,但我无法将其用于第二个声音,因为我出现了重新定义错误

嗯?您是否实现了该方法两次或更多,而不仅仅是比较方法体中的player对象


如果您显示您收到的确切错误消息,这将有所帮助。

Swift 3:

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

哦是的,我完全是想说AudioPlayerDifinishPlay,而不是ApplicationDifinishLaunching。很抱歉我将委托设置为self,它在第一个声音中起作用。但问题不是AudioPlayerDifinishPlaying不起作用,问题是我不知道如何再次播放第二个声音。我有两种不同的声音。顺便说一下,当我输入[player setDelegate:self]时,我得到警告:“类'ViewController'不实现'AVAudioPlayerDelegate'协议。”这是个问题吗?您需要将自己设置为这两种声音的代表。当它向您发送代理消息时,声音会自动识别,因此您可以将其与您手头上的声音进行比较。至于警告:它不应该破坏任何东西,但无论如何要修复每个警告,这样您就不会得到20个您一直忽略的警告,从而隐藏一些真正重要的东西。您需要声明您的类符合该协议。哦,好的!这确实有效。谢谢。:)不过,我希望我能为不同的声音做不同的动作。我只能用这种方法对两种声音做相同的动作。(我还有一个问题:有没有办法使用NSTimeInterval获得声音的持续时间?因为该值在其他函数中对我非常有用。)