How to perform operations when playing sound in iPhone?

痞子三分冷 提交于 2019-12-22 06:59:38

问题


I play a MP3 in my iPhone app using AVAudioPlayer; i need to perform some operations at certain times (say 30th seconds, 1 minute); is there a way to invoke callback functions based on mp3 playing time?


回答1:


I believe the best solution is to start an NSTimer as you start the AVAudioPlayer playing. You could set the timer to fire every half second or so. Then each time your timer fires, look at the currentTime property on your audio player.

In order to do something at certain intervals, I'd suggest you kept an instance variable for the playback time from last time your timer callback was called. Then if you had passed the critical point between last callback and this, do your action.

So, in pseudocode, the timer callback:

  1. Get the currentTime of your AVAudioPlayer
  2. Check to see if currentTime is greater than criticalPoint
  3. If yes, check to see if lastCurrentTime is less than criticalPoint
  4. If yes to that too, do your action.
  5. Set lastCurrentTime to currentTime



回答2:


If you're able to use AVPlayer instead of AVAudioPlayer, you can set boundary or periodic time observers:

// 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 documentation: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html




回答3:


I found this link describing a property property which seems to indicate you can get the current playback time.

If the sound is playing, currentTime is the offset of the current playback position, measured in seconds from the start of the sound. If the sound is not playing, currentTime is the offset of where playing starts upon calling the play method, measured in seconds from the start of the sound.

By setting this property you can seek to a specific point in a sound file or implement audio fast-forward and rewind functions.

To check the time and perform your action you can simply query it:

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



回答4:


with multithreading your goal is simple, just do like this :

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:


Yes Sure you can ...it's tricky i hope it works for you but it works for me ..

1- you play your mp3 file.

2- [self performSelector:@selector(Operation:) withObject:Object afterDelay:30]; then the function

-(void)Operation:(id)sender;

called; so you fired function after 30 second of mp3 file .. you can make many of function based on time you want..

3- there is other solution using timers

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

it will fire function called Check Time

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

then you can change time interval you want and repeats is for you to control repeat this action every 5 seconds or not.. Hope that helpful..

Thanks




回答6:


i think ,you want to play different sound-files after 30sec then use this code :

1) all sound-files put in Array and then retrieve from document directory

2)then try this:

-(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];   
}


来源:https://stackoverflow.com/questions/10558288/how-to-perform-operations-when-playing-sound-in-iphone

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