ijkPlayer 简单使用

作者: BWLi420 | 来源:发表于2018-05-11 17:56 被阅读18次

    上一篇文章ijkPlayer编译、打包、多格式及Https支持中详细介绍了 ijkPlayer 的编译及集成,这里说一下简单的使用。

    #import <IJKMediaFramework/IJKMediaPlayer.h>
    
    @interface PlayerViewController ()
    
    @property (nonatomic,strong) id<IJKMediaPlayback> player;
    
    @property (nonatomic, weak) UIView *disPlayerView;
    
    @end
    
    @implementation PlayerViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        [self createPlayerBaseView];
        
        [self createBtn];
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            [self createPlayerWithUrlStr:@"http://pl-ali.youku.com/playlist/m3u8?vid=XMTUxMTU0NzA3Ng%3D%3D&type=mp4&ups_client_netip=7ccda03e&utid=WvVPj35hEWUDAD1%2F6UmfLEIM&ccode=0590&psid=5d12228feb98c5a249ae6a63df2442a6&duration=6808&expire=18000&drm_type=1&drm_device=10&ups_ts=1526032072&onOff=0&encr=0&ups_key=e063ff139dc55f75c431a5954ae66b59"];
        });
    }
    
    - (void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
        
        [self removeMovieNotificationObservers];
        [self.player stop];
        [[self.player view] removeFromSuperview];
    }
    
    #pragma mark - 按钮
    - (void)createBtn {
        
        UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        playBtn.backgroundColor = [UIColor orangeColor];
        playBtn.frame = CGRectMake(10, 500, 100, 40);
        [playBtn setTitle:@"播放/暂停" forState:UIControlStateNormal];
        [playBtn addTarget:self action:@selector(playBtnClick) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:playBtn];
    }
    
    - (void)playBtnClick {
        
        if (self.player.isPlaying) {
            
            [self.player pause];
        }else {
            
            [self.player play];
        }
    }
    
    - (void)createPlayerBaseView {
        
        UIView *disPlayerView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width/16.0*9.0)];
        self.disPlayerView = disPlayerView;
        disPlayerView.backgroundColor = [UIColor blackColor];
        [self.view addSubview:disPlayerView];
    }
    
    - (void)createPlayerWithUrlStr:(NSString *)urlStr {
        
        NSURL *url = [NSURL URLWithString:urlStr];
        
        IJKFFOptions *options = [IJKFFOptions optionsByDefault];
        //非标准桢率会导致音画不同步,所以设定为 15 或者 29.97
        [options setOptionValue:@"29.97" forKey:@"max-fps" ofCategory:kIJKFFOptionCategoryPlayer];
        //若视频处理不过来,会导致音视频不同步,此时丢掉部分帧
        [options setPlayerOptionIntValue:5 forKey:@"framedrop"];
        
        self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];
        UIView *playerView = [self.player view];
        NSLog(@"%@", self.player);
        playerView.frame = self.disPlayerView.bounds;
        
        [self.disPlayerView insertSubview:playerView atIndex:1];
        [self installMovieNotificationObservers];
        
        if (![self.player isPlaying]) {
            [self.player prepareToPlay];
        }
    }
    
    #pragma Selector func
    
    - (void)loadStateDidChange:(NSNotification*)notification {
        IJKMPMovieLoadState loadState = _player.loadState;
        
        if ((loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
            NSLog(@"LoadStateDidChange: IJKMovieLoadStatePlayThroughOK: %d\n",(int)loadState);
        }else if ((loadState & IJKMPMovieLoadStateStalled) != 0) {
            NSLog(@"loadStateDidChange: IJKMPMovieLoadStateStalled: %d\n", (int)loadState);
        } else {
            NSLog(@"loadStateDidChange: ???: %d\n", (int)loadState);
        }
    }
    
    - (void)moviePlayBackFinish:(NSNotification*)notification {
        int reason =[[[notification userInfo] valueForKey:IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
        switch (reason) {
            case IJKMPMovieFinishReasonPlaybackEnded:
                NSLog(@"playbackStateDidChange: IJKMPMovieFinishReasonPlaybackEnded: %d\n", reason);
                break;
                
            case IJKMPMovieFinishReasonUserExited:
                NSLog(@"playbackStateDidChange: IJKMPMovieFinishReasonUserExited: %d\n", reason);
                break;
                
            case IJKMPMovieFinishReasonPlaybackError:
                NSLog(@"playbackStateDidChange: IJKMPMovieFinishReasonPlaybackError: %d\n", reason);
                break;
                
            default:
                NSLog(@"playbackPlayBackDidFinish: ???: %d\n", reason);
                break;
        }
    }
    
    - (void)mediaIsPreparedToPlayDidChange:(NSNotification*)notification {
        NSLog(@"mediaIsPrepareToPlayDidChange\n");
    }
    
    - (void)moviePlayBackStateDidChange:(NSNotification*)notification {
        switch (_player.playbackState) {
            case IJKMPMoviePlaybackStateStopped:
                NSLog(@"IJKMPMoviePlayBackStateDidChange %d: stoped", (int)_player.playbackState);
                break;
                
            case IJKMPMoviePlaybackStatePlaying:
                NSLog(@"IJKMPMoviePlayBackStateDidChange %d: playing", (int)_player.playbackState);
                break;
                
            case IJKMPMoviePlaybackStatePaused:
                NSLog(@"IJKMPMoviePlayBackStateDidChange %d: paused", (int)_player.playbackState);
                break;
                
            case IJKMPMoviePlaybackStateInterrupted:
                NSLog(@"IJKMPMoviePlayBackStateDidChange %d: interrupted", (int)_player.playbackState);
                break;
                
            case IJKMPMoviePlaybackStateSeekingForward:
            case IJKMPMoviePlaybackStateSeekingBackward: {
                NSLog(@"IJKMPMoviePlayBackStateDidChange %d: seeking", (int)_player.playbackState);
                break;
            }
                
            default: {
                NSLog(@"IJKMPMoviePlayBackStateDidChange %d: unknown", (int)_player.playbackState);
                break;
            }
        }
    }
    
    #pragma Install Notifiacation
    
    - (void)installMovieNotificationObservers {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(loadStateDidChange:)
                                                     name:IJKMPMoviePlayerLoadStateDidChangeNotification
                                                   object:_player];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlayBackFinish:)
                                                     name:IJKMPMoviePlayerPlaybackDidFinishNotification
                                                   object:_player];
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(mediaIsPreparedToPlayDidChange:)
                                                     name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                                   object:_player];
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlayBackStateDidChange:)
                                                     name:IJKMPMoviePlayerPlaybackStateDidChangeNotification
                                                   object:_player];
        
    }
    
    #pragma Remove Notifiacation
    
    - (void)removeMovieNotificationObservers {
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:IJKMPMoviePlayerLoadStateDidChangeNotification
                                                      object:_player];
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:IJKMPMoviePlayerPlaybackDidFinishNotification
                                                      object:_player];
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                                      object:_player];
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:IJKMPMoviePlayerPlaybackStateDidChangeNotification
                                                      object:_player];
        
    }
    

    相关文章

      网友评论

        本文标题:ijkPlayer 简单使用

        本文链接:https://www.haomeiwen.com/subject/twqqdftx.html