iOS简单直播实现(三:IJKMediaFramework拉流)

  推流完成后,需要拉流才能进行完整的直播。拉流我们采用的也是一个开源的第三方库IJKMediaFramework。

  这个库本质是一个播放器,能播放flv格式的播放器。用起来和ios自带的AVPlayer很相似。

  实现功能:1.拉流播放。2.监听。

一.创建占位图和卡顿占位动效,代码如下:

//直播前的占位图片- (UIImageView *)placeHolderView
{
    if (!_placeHolderView) {
        _placeHolderView = [[UIImageView alloc] init];
        _placeHolderView.frame = self.view.bounds;
        _placeHolderView.image = [UIImage imageNamed:@"profile_user_414x414"];
        // 强制布局
        [_placeHolderView layoutIfNeeded];
    }
    return _placeHolderView;
}//卡顿占位动效
- (void)showActivityView{
    if (!_activity) {
        _activity= [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        _activity.frame = CGRectMake((SCREAM_WEIGHT-100)*0.5, (SCREAM_HIGHT-100)*0.5, 100, 100);
    }
    [self.activity startAnimating];
    [self.view addSubview:self.activity];
}
//关闭卡顿占位动效
- (void)stopActivityView{
    if ([_activity isAnimating]) {
        [_activity startAnimating];
    }
    [_activity removeFromSuperview];
    _activity = nil;
}

二.拉流播放(创建播放器播放),代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view addSubview:self.placeHolderView];
    [self showActivityView];

    IJKFFOptions *options = [IJKFFOptions optionsByDefault];
    [options setPlayerOptionIntValue:1  forKey:@"videotoolbox"];

    // 帧速率(fps) (可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
    [options setPlayerOptionIntValue:29.97 forKey:@"r"];
    // -vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推
    [options setPlayerOptionIntValue:512 forKey:@"vol"];

    IJKFFMoviePlayerController *moviePlayer = [[IJKFFMoviePlayerController alloc] initWithContentURLString:PLAY_URL withOptions:options];
    moviePlayer.view.frame = self.view.bounds;

    moviePlayer.scalingMode = IJKMPMovieScalingModeAspectFill;
    // 设置自动播放(必须设置为NO, 防止自动播放, 才能更好的控制直播的状态)
    moviePlayer.shouldAutoplay = NO;
    // 默认不显示
    moviePlayer.shouldShowHudView = NO;
    [self.view insertSubview:moviePlayer.view atIndex:0];

    [moviePlayer prepareToPlay];

    self.moviePlayer = moviePlayer;
    // 设置监听
    [self addObserver];

    [self.view addSubview:self.outBtn];
}

三.设置监听(主要是监听缓存情况),代码如下:

- (void)addObserver
{
    //监听加载状态改变通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateDidChange:) name:IJKMPMoviePlayerLoadStateDidChangeNotification object:self.moviePlayer];
}

- (void)loadStateDidChange:(NSNotification *) notification
{
    //状态为缓冲几乎完成,可以连续播放
    if ((self.moviePlayer.loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
        if (!self.moviePlayer.isPlaying) {
            //开始播放
            [self.moviePlayer play];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                if (_placeHolderView) {
                    [_placeHolderView removeFromSuperview];
                    _placeHolderView = nil;
                }
                [self stopActivityView];
            });
        }else{
            // 如果是网络状态不好, 断开后恢复, 也需要去掉加载
            if ([_activity isAnimating]) {
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                    [self stopActivityView];
                });
            }
        }
    }
    //缓冲中
    else if (self.moviePlayer.loadState & IJKMPMovieLoadStateStalled){
        [self showActivityView];
        /*
            这里主播可能已经结束直播了。我们需要请求服务器查看主播是否已经结束直播。
            方法:
            1、从服务器获取主播是否已经关闭直播。
                优点:能够正确的获取主播端是否正在直播。
                缺点:主播端异常crash的情况下是没有办法通知服务器该直播关闭的。
            2、用户http请求该地址,若请求成功表示直播未结束,否则结束
                优点:能够真实的获取主播端是否有推流数据
                缺点:如果主播端丢包率太低,但是能够恢复的情况下,数据请求同样是失败的。
         */
        __weak typeof(self)weakSelf = self;
        [[ALinNetworkTool shareTool] GET:PLAY_URL parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功%@, 等待继续播放", responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败, 加载失败界面, 关闭播放器%@", error);
            [weakSelf performSelector:@selector(outBtnTouched)];
        }];
    }
}

四.记得关闭前释放

- (void)dealloc{
    if (_moviePlayer) {
        [_moviePlayer shutdown];
        [_moviePlayer.view removeFromSuperview];
        _moviePlayer = nil;
    }
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}

总结:项目中还有许多缺陷等待一一完善。

  

时间: 2024-08-27 13:11:59

iOS简单直播实现(三:IJKMediaFramework拉流)的相关文章

直播系统搭建:拉流端的三个环节及服务器部署重点

拉流端的三个环节 1. 用户想看直播就要去服务器进行拉流,什么是拉流?你打开视频网站,点击视频,你点击视频和视频打开之间的时间段,就是你的客户端去向服务器请求拉流了,这一步要注意的是首屏开启时间,时间越短,观众越有可能被留下. 2. 有编码就要有解码,编码上会出现安卓适配问题,那解码上当然也会出现该问题,网络视频直播系统自带编解码程序的优势就在于它能够避免因手机机型不同,视频格式不同而产生的不同机型无法播放的情况. 3. 渲染环节交给手机就可以了,播放之后用户就可以进行观看了. 直播系统源码搭建

iOS简单直播实现(一:创建本地rtmp服务器)

由于业务需求,需要从腾讯直播sdk要迅速转移到自主开发(先让我默哀三分钟).不多说,直接开始唠嗑! 这个项目超级简单,简单到只能一个推流,一个拉流的功能.需求多的再另谈. 前期准备:推流用优酷开源的LFLiveKit框架. 拉流(实际上就是一个播放器)用ijkplayer 框架,当然这个也是开源的. 创建本地rtmp服务器 创建本地rtmp服务器.(这个地方坑比较多,老夫深陷其中欲罢不能) 一.打开终端, 查看是否已经安装了Homebrew, 直接终端输入命令 man brew 如果已经安装就会

iOS简单直播实现(二:推流)

推流用的是一个第三方的IFLiveKit框架.这个框架基于rtmp协议的,c语言和oc语言分开的非常清楚,对oc语言非常友好,使用起来相对简单. IFLiveKit内部集成了GPUIImage.内部实现了图片渲染等美艳效果.减少了开发时候美艳效果的调试. 需求:创建一个简单的推流页面.包含功能有:1.推流状态监听.2.切换摄像头.3.切换美艳效果.4.开关推流. 一.推流之前需要检查摄像头和麦克风等权限是否开启,并启动摄像头,核心代码如下: //判断是否有摄像头 if(![UIImagePick

直播系统推拉流端技术

想要搭建网络视频直播系统就要明白视频直播的过程是什么样的,而直播流程可以分为采集.前处理.压缩编码.推流.拉流.解码.渲染播放这几个环节,其中涉及到推流端.拉流端和服务器三端的知识点,服务器方面的知识点很多,拓幻科技这里先简单说下推流端和拉流端的一些知识点,服务器方面可以先看我以前写的文章. 一. 推流端的四个环节1. 首先是采集环节:采集是指对图像和声音的采集,简单说就是能让网络视频直播系统和主播摄像头连起来,软件能获取到外界的音视频信息.然后是前处理阶段:这里也是俗称美颜的阶段,这要求我们在

iOS:直播app---原理篇

[如何快速的开发一个完整的iOS直播app](原理篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/7b2f1df74420 一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的. 直播易:已经有各个领域的大牛,封装好了许多牛逼的框架,我们只需要用别人写好的框架,就能快速的搭建一

推流和拉流的概念以及RTMP和HLS协议

https://www.bbsmax.com/A/x9J2wZM56o/ 推流为将直播内容推送至服务器的过程:拉流为服务器已有直播内容,用指定地址进行拉取的过程. rtmp rtmp是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进

IJKPlayer集成直播拉流播放

iOS端集成ijkplayer实现直播播放 前言 ijkplayer框架是专门用来做 视频直播 的开源框架,基于ffmpeg,同时支持 Android 和 iOS 平台. 对于 App 中的直播功能,如果我们成功集成ijkplayer ,那么就算完成一半的工程了.接下来,只要获取到 拉流 URL,就能实现视频直播功能了. 但是初次集成这个框架,对于新手还是有一定难度的. 本篇主要介绍如何快速集成 ijkplayer 框架. 最终效果.gif 一.下载 ijkplayer 1.下载 ijkplay

iOS 直播(三)

推流完成后,需要拉流才能进行完整的直播.拉流我们采用的也是一个开源的第三方库IJKMediaFramework. 这个库本质是一个播放器,能播放flv格式的播放器.用起来和ios自带的AVPlayer很相似. 实现功能:1.拉流播放.2.监听. 一.创建占位图和卡顿占位动效,代码如下: //直播前的占位图片- (UIImageView *)placeHolderView { if (!_placeHolderView) { _placeHolderView = [[UIImageView all

绝对独创---关于直播(推流-拉流-服务器搭建)

1.公司有风声要做直播,赶好这段有时间,自己研究了一下.其实走过的弯路比较多,后来在拉流/推流/服务器搭建都完成之后,思路变得很清晰. 2.首先从服务器搭建说起,关于三种主流的HLS/RTMP/FLV,这里我使用的是RTMP,关于其中的切换,我们需要看一下ngnix的配置文件的相关参数文档. 我使用的是ngnix+rtmp,也就是本地搭建ngnix服务器,另外在ngnix服务器上添加了rtmp的模块.闭门造车容易猝死,我参考的是简书上的,请移步:http://www.jianshu.com/p/