AVPlayer not playing MP3 audio file in documents directory iOS

avfoundation, avplayer, ios, objective-c

Solution

Do this:

- (void)setupAudio
{
 if([NSFileManager defaultManager] fileExistsAtPath:[self.urlForEightBarAudioFile absoluteString]])
 {
   AVAsset *eightBarAsset = [AVAsset assetWithURL:self.urlForEightBarAudioFile];
   self.eightBarsPlayerItem = [[AVPlayerItem alloc] initWithAsset:eightBarAsset];
   self.eightBarsPlayer = [AVPlayer playerWithPlayerItem:self.eightBarsPlayerItem]; //forgot this line
   [self.eightBarsPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; // add observer for player not item
 }
}

Refer avplayer-and-local-files link

Problem

I'm using AVPlayer to play a MP3 located in the documents directory (file is confirmed to be in there) - I load the `AVPlayerItem` wait for the `AVPlayerItemStatusReadyToPlay` then instantiate the `AVPlayer` with the item and play. The `AVPlayerItemStatusReadyToPlay` does get called, but no audio actually plays, anyone have an idea why? ``` - (void)checkFileExists { if (![[NSFileManager defaultManager] fileExistsAtPath:[self.urlForEightBarAudioFile path]]) { [self beginEightBarDownload]; } else { // set up audio [self setupAudio]; //NSLog(@"file %@ already exists", [self.urlForEightBarAudioFile path]); } } - (void)setupAudio { AVAsset *eightBarAsset = [AVAsset assetWithURL:self.urlForEightBarAudioFile]; self.eightBarsPlayerItem = [[AVPlayerItem alloc] initWithAsset:eightBarAsset]; [self.eightBarsPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([object isKindOfClass:[AVPlayerItem class]]) { AVPlayerItem *item = (AVPlayerItem *)object; if ([keyPath isEqualToString:@"status"]) { switch(item.status) { case AVPlayerItemStatusFailed: break; case AVPlayerItemStatusReadyToPlay: self.player = [[AVPlayer alloc] initWithPlayerItem:self.eightBarsPlayerItem]; [self.player play]; NSLog(@"player item status is ready to play"); break; case AVPlayerItemStatusUnknown: NSLog(@"player item status is unknown"); break; } } else if ([keyPath isEqualToString:@"playbackBufferEmpty"]) { if (item.playbackBufferEmpty) { NSLog(@"player item playback buffer is empty"); } } } } ```

Original source

Related problems