Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Knowing when AVPlayer object is ready to play

I'm trying to play an MP3 file that is passed to an UIView from a previous UIView (stored in a NSURL *fileURL variable).

I'm initializing an AVPlayer with:

player = [AVPlayer playerWithURL:fileURL];  NSLog(@"Player created:%d",player.status); 

The NSLog prints Player created:0, which i figured means it is not ready to play yet.

When i click the play UIButton, the code i run is:

-(IBAction)playButtonClicked {     NSLog(@"Clicked Play. MP3:%@",[fileURL absoluteString]);      if(([player status] == AVPlayerStatusReadyToPlay) && !isPlaying) //  if(!isPlaying)     {         [player play];         NSLog(@"Playing:%@ with %d",[fileURL absoluteString], player.status);         isPlaying = YES;     }     else if(isPlaying)     {          [player pause];         NSLog(@"Pausing:%@",[fileURL absoluteString]);         isPlaying = NO;     }     else {         NSLog(@"Error in player??");     }  } 

When i run this, I always get Error in player?? in the console. If i however replace the if condition that checks if AVPlayer is ready to play, with a simple if(!isPlaying)..., then the music plays the SECOND TIME I click on the play UIButton.

The console log is:

Clicked Play. MP3:http://www.nimh.nih.gov/audio/neurogenesis.mp3 Playing:http://www.nimh.nih.gov/audio/neurogenesis.mp3 **with 0**  Clicked Play. MP3:http://www.nimh.nih.gov/audio/neurogenesis.mp3 Pausing:http://www.nimh.nih.gov/audio/neurogenesis.mp3  Clicked Play. MP3:http://www.nimh.nih.gov/audio/neurogenesis.mp3 2011-03-23 11:06:43.674 Podcasts[2050:207] Playing:http://www.nimh.nih.gov/audio/neurogenesis.mp3 **with 1** 

I see that the SECOND TIME, the player.status seems to hold 1, which I'm guessing is AVPlayerReadyToPlay.

What can I do to have the playing to work properly the first time i click the play UIButton? (ie, how can i make sure the AVPlayer is not just created, but also ready to play?)

like image 438
mvishnu Avatar asked Mar 23 '11 06:03

mvishnu


People also ask

How do I know if Avplayer is paused?

Currently with swift 5 the easiest way to check if the player is playing or paused is to check the . timeControlStatus variable.

What is Avasset?

An object that models timed audiovisual media.


1 Answers

You are playing a remote file. It may take some time for the AVPlayer to buffer enough data and be ready to play the file (see AV Foundation Programming Guide)

But you don't seem to wait for the player to be ready before tapping the play button. What I would to is disable this button and enable it only when the player is ready.

Using KVO, it's possible to be notified for changes of the player status:

playButton.enabled = NO; player = [AVPlayer playerWithURL:fileURL]; [player addObserver:self forKeyPath:@"status" options:0 context:nil];    

This method will be called when the status changes:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object                         change:(NSDictionary *)change context:(void *)context {     if (object == player && [keyPath isEqualToString:@"status"]) {         if (player.status == AVPlayerStatusReadyToPlay) {             playButton.enabled = YES;         } else if (player.status == AVPlayerStatusFailed) {             // something went wrong. player.error should contain some information         }     } } 
like image 140
Jilouc Avatar answered Dec 10 '22 07:12

Jilouc