4

I am trying to play a local video from my app using AVPlayer. I have looked everywhere but can't find any useful tutorials/demos/documentation. Here is what I am trying, but it is not playing. Any idea why? The URL is valid because I was using the same one to play a video using MPMoviePlayer successfully.

       Video *currentVideo = [videoArray objectAtIndex:0];

    NSString *filepath = currentVideo.videoURL;
    NSURL *fileURL = [NSURL fileURLWithPath:filepath];

    AVURLAsset *asset = [AVURLAsset assetWithURL: fileURL];
    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset: asset];
    self.player = [[AVPlayer alloc] initWithPlayerItem: item];


    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;


    layer.frame = CGRectMake(0, 0, 1024, 768);
    [self.view.layer addSublayer: layer];


    [self.player play];
Josue Espinosa
  • 5,009
  • 16
  • 47
  • 81

1 Answers1

5

I believe the problem is that you're assuming that after executing this line AVURLAsset *asset = [AVURLAsset assetWithURL: fileURL]; the asset is ready to use. This is not the case as noted in the AV Foundation Programming Guide:

    You create an asset from a URL using AVURLAsset. Creating the asset, however, 
    does not necessarily mean that it’s ready for use. To be used, an asset must 
    have loaded its tracks.

After creating the asset try loading it's tracks:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";

[asset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler:
 ^{
     NSError *error;
     AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];

     if (status == AVKeyValueStatusLoaded) { 

         // At this point you know the asset is ready
         self.playerItem = [AVPlayerItem playerItemWithAsset:asset];

         ...
     }
 }];

Please refer to this link to see the complete example.

Hope this helps!

LuisCien
  • 6,362
  • 4
  • 34
  • 42
  • @LuisCien i am facing the same problem now, and i have used your code. but it returned me `AVKeyValueStatusFailed`, please see my question and suggest me some if you understand. http://stackoverflow.com/questions/29255776/cannot-get-the-duration-of-mp4-file-by-using-avasset-or-avurlasset – Syed Ali Salman Mar 25 '15 at 12:49