如何在iPhone中播放声音时执行操作?

时间:2012-05-11 20:37:00

标签: iphone avaudioplayer

我使用AVAudioPlayer在我的iPhone应用程序中播放MP3;我需要在某些时间执行某些操作(比如30秒,1分钟);有没有办法根据mp3播放时间调用回调函数?

6 个答案:

答案 0 :(得分:8)

我认为最好的解决方案是在开始NSTimer游戏时启动AVAudioPlayer。您可以将计时器设置为每半秒左右触发一次。然后,每次计时器触发时,请查看音频播放器上的currentTime属性。

为了按特定时间间隔执行某些操作,我建议您为上次调用计时器回调时的回放时间保留一个实例变量。然后,如果您已经通过了上次回调和此之间的关键点,请执行您的操作。

所以,在伪代码中,定时器回调:

  1. 获取AVAudioPlayer的currentTime
  2. 检查currentTime是否大于criticalPoint
  3. 如果是,请检查lastCurrentTime是否小于criticalPoint
  4. 如果也是,请采取行动。
  5. lastCurrentTime设为currentTime

答案 1 :(得分:5)

如果你能够使用AVPlayer而不是AVAudioPlayer,你可以设置边界或周期时间观察者:

// File URL or URL of a media library item
AVPlayer *player = [[AVPlayer alloc] initWithURL:url];        

CMTime time = CMTimeMakeWithSeconds(30.0, 600);
NSArray *times = [NSArray arrayWithObject:[NSValue valueWithCMTime:time]];

id playerObserver = [player addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
    NSLog(@"Playback time is 30 seconds");            
}];

[player play];

// remove the observer when you're done with the player:
[player removeTimeObserver:playerObserver];

AVPlayer文档: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html

答案 2 :(得分:1)

我发现this link描述了一个属性属性,它似乎表明你可以获得当前的播放时间。

  

如果正在播放声音,则currentTime是当前的偏移量   播放位置,以声音开始后的秒数为单位。如果   声音没有播放,currentTime是播放的偏移量   从调用播放方法开始,以秒为单位测量   声音的开始。

     

通过设置此属性,您可以搜索声音中的特定点   提供或实现音频快进和快退功能。

要查看时间并执行操作,您只需查询:

if (avAudioPlayerObject.currentTime == 30.0) //You may need a more broad check. Double may not be able to exactly represent 30.0s
{
    //Do Something
}

答案 3 :(得分:1)

是的,你可以......这很棘手我希望它适合你,但它对我有用..

1- you play your mp3 file.

2- [self performSelector:@selector(Operation:) withObject:Object afterDelay:30]; 那么功能

-(void)Operation:(id)sender;

调用;所以你在30秒的mp3文件后解雇了函数..你可以根据你想要的时间做很多功能..

3-还有其他使用计时器的解决方案

[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(CheckTime:) userInfo:nil repeats:YES];

它将触发名为Check Time的功能

-(void)CheckTime:(id)sender{
   if (avAudioPlayerObject.currentTime == 30.0)
   {
       //Do Something
       //Fire and function call such
       [self performSelector:@selector(Operation:) withObject:Object]
   }
}

然后你可以改变你想要的时间间隔,重复是你控制每5秒重复一次这个动作。 希望有帮助..

由于

答案 4 :(得分:1)

多线程

你的目标很简单,就像这样:

1 :  in your main thread create a variable for storing time passed 
2 :  create new thread like "checkthread" that check each 30-20 sec(as you need)
3 :  if the time passed is what you want do the callback  

答案 5 :(得分:1)

我想,你想在30秒后播放不同的声音文件,然后使用这段代码:

1)将所有声音文件放入Array中,然后从文档目录中检索

2)然后试试这个:

-(IBAction)play_sound
{

    BackgroundPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:[Arr_tone_selected objectAtIndex:j]ofType:@"mp3"]]error:NULL];
    BackgroundPlayer.delegate=self;

    [BackgroundPlayer play];


}   


- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [BackgroundPlayer stop];
    j++;
    [self performSelector:@selector(play_sound) withObject:Object afterDelay:30];   
}