Why this Objective-C code won't play an AVPlayerViewController video?

enter image description hereBoth are in viewDidLoad().
What’s wrong with this objective-c source file?
The swift version works like a charm…
Xcode ver. 8.2 iOS 10

Swift (OK):

  • How to detect when AVPlayer video ends playing?
  • AVPlayer - Fast Backward / Forward Stream
  • AVPlayerViewController doesn't play local videos
  • AVPlayer Can't Play
  • How to achieve a playback rate of 4.0 with AVPlayer in iOS?
  • AVPlayerLayer shows black screen but sound is working
  •         let path : String = Bundle.main.path(forResource: "charlie", ofType: "mp4")!
            let movieurl : URL = URL(fileURLWithPath: path)
            let movie : AVPlayerViewController = AVPlayerViewController()
            movie.view.frame = self.view.bounds
    
            let player : AVPlayer = AVPlayer(url: movieurl)
            movie.player = player
    
            self.view.addSubview(movie.view)
            player.play()
    

    Objective-C (Won’t show/play the video):

            AVPlayerViewController* movie;
            AVPlayer* player;
    
            NSString *path = [[NSBundle mainBundle]
                pathForResource:@"charlie" ofType:@"mp4"];
    
            NSURL *url = [NSURL URLWithString:path] ;
    
            movie = [[AVPlayerViewController alloc] init];
            movie.view.frame = self.view.bounds;
            player = [[AVPlayer alloc] initWithURL:url];
    
            [movie setPlayer:player];
            [self.view addSubview:movie.view];
    
            [player play];
    

    2 Solutions Collect From Internet About “Why this Objective-C code won't play an AVPlayerViewController video?”

    @import AVKit;
    @import AVFoundation;
    @property (nonatomic) AVPlayer *avPlayer; 
    @property (nonatomic) AVPlayerViewController* avPlayerView;
    
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Video1" ofType:@"mp4"];
    
    NSURL *url = [[NSURL alloc] initFileURLWithPath: path];
    
    AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];
    
    avPlayer = [AVPlayer playerWithPlayerItem:anItem];
    [avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
    self.avPlayerView = [[AVPlayerViewController alloc] init];
    self.avPlayerView.view.frame = self.view.bounds; 
    [self.avPlayerView setPlayer:_avPlayer]; 
    [self.view addSubview:_avPlayerView.view]; 
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
        if (object == avPlayer && [keyPath isEqualToString:@"status"]) {
            if (avPlayer.status == AVPlayerStatusFailed) {
                NSLog(@"AVPlayer Failed");
            } else if (avPlayer.status == AVPlayerStatusReadyToPlay) {
                NSLog(@"AVPlayer Ready to Play");
            } else if (avPlayer.status == AVPlayerItemStatusUnknown) {
                NSLog(@"AVPlayer Unknown");
            }
        }
    }
    
    -(IBAction) BtnPlay:(id)sender {
        [avPlayer play];
    }
    
    -(IBAction) BtnPause:(id)sender {
        [avPlayer pause];
    }
    

    Try my code . if any issue with my code put comment .
    Thank You.
    Happy Coding.

    NSString *path = [[NSBundle mainBundle]
    pathForResource:@”charlie” ofType:@”mp4″];

    Try

    Using [NSURL fileURLWithPath:path] instead of [NSURL URLWithString:path]

    [NSURL fileURLWithPath]

    Or

    [[NSBundle mainBundle] URLForResource:@”charlie” withExtension:@”mp4″]