iOS Bilibili/ijkplayer 集成与使用

  • 集成:

下载:gitHub链接  -- https://github.com/Bilibili/ijkplayer

编译:

iOS Bilibili/ijkplayer 集成与使用_第1张图片

通过以上图片中命令行来编译ffmpeg(编译时间较长,耐心等待即可)。

 打包IJKMediaFramework

工程打开后设置工程的 scheme, 具体步骤如下图:

第一步.png

第二步.png

3.设置好 scheme 后, 分别选择真机和模拟器进行编译, 编译完成后, 进入 Finder, 如下图:

进入 Finder 后, 可以看到有真机和模拟器两个版本的编译结果, 如下图:

运行后生成的文件.png

下面开始合并真机和模拟器版本的 framework, 注意不要合并错了, 合并的是这个文件, 如下图:

合并真机和模拟器文件中的这个文件.png

打开终端, 进行合并, 命令行具体格式为:

合并后如下图:

合并生成后的文件.png

下面很重要, 需要用合并后的IJKMediaFramework把原来的IJKMediaFramework替换掉, 如下图, 希望你能看懂:



==这里提供打包好的可以直接用:IJMediaFramework


添加其他依赖库:

iOS Bilibili/ijkplayer 集成与使用_第2张图片


  •  使用:

导入:#import

///播放器controller (哔哩哔哩)

@interface PlayViewController ()

@property(nonatomic,strong)IJKFFMoviePlayerController * player;

@end


- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    [self.view addGestureRecognizer:_resetBottomTapGesture];
    [self.conversationMessageCollectionView reloadData];
    //准备播放 (哔哩哔哩)
    [self.player prepareToPlay];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.navigationTitle = self.navigationItem.title;
}


/**
 *  移除监听
 *
 *  @param animated
 */
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    [[NSNotificationCenter defaultCenter]
     removeObserver:self
     name:@"kRCPlayVoiceFinishNotification"
     object:nil];
    
    [self.conversationMessageCollectionView removeGestureRecognizer:_resetBottomTapGesture];
    [self.conversationMessageCollectionView
     addGestureRecognizer:_resetBottomTapGesture];
    
    //退出页面,弹幕停止
    [self.view stopDanmaku];
    // 停止播放
//    [_txlivePlayer stopPlay];
//    [_txlivePlayer removeVideoWidget]; // 记得销毁view控件
}

- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    //销毁播放器
    [self.player shutdown];
}

#pragma mark -- 视频播放器
- (void)addPlayerWithurl:(NSString *)url{

// 创建player
    //bilibili 播放器
    IJKFFOptions *options = [IJKFFOptions optionsByDefault]; //使用默认配置
    self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url] withOptions:options]; //初始化播放器,播放在线视频或直播(RTMP)
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    self.player.view.frame = _playView.bounds;
    self.player.scalingMode = IJKMPMovieScalingModeFill; //缩放模式
    self.player.shouldAutoplay = YES; //开启自动播放
    _playView.autoresizesSubviews = YES;
    [_playView addSubview:self.player.view];
}
    //监听加载状态改变通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateDidChange:) name:IJKMPMoviePlayerLoadStateDidChangeNotification object:nil];

 
  
- (void)stopBtnDidClicked:(UIButton *)sender{
    if (!sender.selected) {
        // 暂停播放
        [self.player pause];
    }else{
        //恢复播放
        [self.player play];
    }
    //改变状态
    sender.selected = !sender.selected;
}
 
  
///播放状态发生改变时
- (void)loadStateDidChange:(NSNotification *) notification
{
    //状态为缓冲几乎完成,可以连续播放
    if ((self.player.loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
        if (!self.player.isPlaying) {
            //开始播放
            [self.player play];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:self.player.view animated:YES];
                if (_noPlayView.hidden == NO) {
                    _noPlayView.hidden = YES;
                }
            });
        }else{
            // 如果是网络状态不好, 断开后恢复, 也需要去掉加载
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:self.player.view animated:YES];
                if (_noPlayView.hidden == NO) {
                    _noPlayView.hidden = YES;
                }
            });
        }
    }
    //缓冲中
    else if (self.player.loadState & IJKMPMovieLoadStateStalled){
        [MBProgressHUD showHUDAddedTo:self.player.view animated:YES];
         [[DataHandle sharedDataHandel]getPlayRoomInfoWithRoomID:self.roomId Block:^(id object) {
             ///判断是否正在播放
             if ([((RoomPlayInfoModel *)object).live_status isEqual:@0]) {
                 //主播不在家  播放状态
                 _isBiliPlay = NO;
                 _noPlayView.hidden = NO;
                 //_noPlayView.hidden = YES;
             }
         }];
        /*
         这里主播可能已经结束直播了。我们需要请求服务器查看主播是否已经结束直播。
         方法:
         1、从服务器获取主播是否已经关闭直播。
         优点:能够正确的获取主播端是否正在直播。
         缺点:主播端异常crash的情况下是没有办法通知服务器该直播关闭的。
         2、用户http请求该地址,若请求成功表示直播未结束,否则结束
         优点:能够真实的获取主播端是否有推流数据
         缺点:如果主播端丢包率太低,但是能够恢复的情况下,数据请求同样是失败的。
         */
    }
}



 
 

你可能感兴趣的:(iOS Bilibili/ijkplayer 集成与使用)