audioPlayerDidFinishPlaying never triggers

匿名 (未验证) 提交于 2019-12-03 03:08:02

问题:

I created a custom class to handle audio playback.

AudioPlayback.h

#import <Foundation/Foundation.h> #import "AVFoundation/AVAudioPlayer.h" #import <AVFoundation/AVFoundation.h>  @interface AudioPlayback : NSObject <AVAudioPlayerDelegate> {      AVAudioPlayer   *player;      BOOL playing;     NSTimeInterval duration;      } @property (nonatomic, assign) AVAudioPlayer *player; @property (readonly) BOOL playing; @property (readonly) NSTimeInterval duration;  -(NSTimeInterval)GetSoundFileDuration:(NSString *) sound_file_name; -(void)PlaySoundFile:(NSString *) sound_file_name; -(void)play; -(void)stop;  - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag; @end 

Then, in AudioPlayback.h

#import "AudioPlayback.h"  @implementation AudioPlayback  @synthesize player;  -(id)init { self = [super init]; if (self != nil) {     player = [[AVAudioPlayer alloc] init];     [player initWithContentsOfURL:nil error:nil];     player.delegate = self; } return self; }  -(void)PlaySoundFile:(NSString *) sound_file_name {     NSURL *sound_file = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:sound_file_name ofType:@"mp3"]];      [player initWithContentsOfURL:sound_file error:nil];     [player prepareToPlay];     [player play];     [sound_file release]; }  ...  - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { NSLog(@"audioPlayerDidFinishPlaying"); } 

The callback never triggers. Am I missing anything obvious?

回答1:

I think "player.delegate = self" is call too early. You "initWithContentsOfURL" again in your "PlaySoundFile", which I think that cause the problem.

Try to put "player.delegate = self" before the "[player prepareToPlay]" in your "PlaySoundFile" method



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!