iOS 本地nginx LFLiveKit IJKPlayer的一系列直播推流拉流操作

1.nginx rtmp本地推流拉流服务器搭建
1.1 安装 (没安装brew的同学,阔以看下这篇文章http://blog.csdn.net/wdd1324/article/details/72769789

 sudo brew install nginx

1.2 查看版本号

nginx -v

安装成功则返回 nginx version: nginx/1.12.2
1.3 启动nginx

sudo nginx

如果报错

nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

这个是端口被占用,我们可以杀死其他占用该端口号的进程或者在nginx.conf里修改端口号
先说杀死一个进程的方法,后面会说到修改nginx.conf

sudo lsof -i tcp:8080

然后找到PID值,再kill掉该进程

kill PID

再次启动 nginx
启动成功
打开浏览器 输入http://localhost:8080 出现以下界面则成功


1.4 配置nginx
打开终端 cd到nginx目录下

cd /usr/local/etc/nginx

运行vim 打开nginx.conf

vim nginx.conf

配置rtmp (这里可以不用做配置,直接用一个端口就能实现推拉,推拉都为同一个端口)
listen为监听的端口号,192.168.4.205是我本地的ip地址,我用一个src作为推流地址,一个des作为拉流地址,用ffmpeg将输入源接入输出源,360x480为输出的分辨率

rtmp {

    server {

        listen 8080;

        chunk_size 4000;

# TV mode: one publisher, many subscribers
        application src {

# enable live streaming
            live on;
            interleave on;
            wait_key on;

# publish only from localhost
            allow publish all;
#deny publish all;

            allow play all;
 exec /usr/local/opt/ffmpeg/bin/ffmpeg  -i rtmp://192.168.4.205:8080/src -vcodec libx264 -vprofile main -tune zerolatency -s 360x480 -pix_fmt yuv420p -movflags +faststart -preset ultrafast  -f flv rtmp://192.168.4.205:8080/des;
        }
        application des {
            live on;
            interleave on;
            wait_key on;
        }
    }
}

1.5 重启nginx

sudo nginx -s reload

这样就OK啦,可以在mac上通过OBS来推流,VLC来拉流测试是否成功。

1.6 其他命令与问题
关闭nginx

sudo nginx -s stop

2.使用LFLiveKit来推流(采用的是h264视频编码,ACC的音频硬编码)
2.1用Pods来添加LFLiveKit

pod 'LFLiveKit'

2.2LFLiveSession初始化
设置视频图像的分辨率

    LFLiveVideoConfiguration *config = [LFLiveVideoConfiguration defaultConfigurationForQuality:LFLiveVideoQuality_Low1];
    config.videoSize = CGSizeMake(360, 512);   //图片分辨率

初始化session

    _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfigurationForQuality:LFLiveAudioQuality_Low] videoConfiguration:config captureType:LFLiveCaptureMaskVideo];
    _session.preView= self.livingPushView;    //推流预览
    _session.captureDevicePosition = AVCaptureDevicePositionUnspecified;    //设置为后置摄像头,默认为前置摄像头
    _session.beautyFace = NO;    //是否美颜
    _session.running = YES;    //是否播放(默认为NO的,不添加则无预览图像)
    _session.delegate = self;    //设置代理

2.3LFLive的代理方法
根据代理可以查看到推流状态

- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state {
    switch (state) {
        case LFLiveReady: {
            NSLog(@"-准备");
        }
            break;
        case LFLivePending: {
            NSLog(@"-连接中");
        }
            break;
        case LFLiveStart: {
            NSLog(@"-已连接");
        }
            break;
        case LFLiveStop: {
            NSLog(@"-已断开");
        }
            break;
        case LFLiveError: {
            NSLog(@"-连接出错");
        }
            break;
        case LFLiveRefresh: {
            NSLog(@"-正在刷新");
        }
            break;
        default:
            break;
    }
}

2.4 开始推流

    LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
    stream.url = @"rtmp://192.168.4.205:8080/src";
    [self.session startLive:stream];

界面消失的时候停止推流

    [self.session stopLive];

下面我们看一下拉流

  1. IJKPlayer
    3.1IJKMediaFramework集成
    大家阔以看下这片文章,写得很详细
    http://www.jianshu.com/p/1f06b27b3ac0
    3.2 IJKMediaFramework集成成功后,在使用的地方导入
    #import <IJKMediaFramework/IJKFFOptions.h>
    #import <IJKMediaFramework/IJKMediaPlayer.h>
    #import <IJKMediaFramework/IJKFFMoviePlayerController.h>

3.3 配置IJKFFOptions

    IJKFFOptions *options = [IJKFFOptions optionsByDefault];
    [options setPlayerOptionValue:@"1" forKey:@"an"];  //静音设置
    [options setPlayerOptionValue:@"1" forKey:@"videotoolbox"];  //开启硬解码
    [options setPlayerOptionIntValue:10 forKey:@"max-buffer-size"];  //最大缓存
    [options setFormatOptionIntValue:10 forKey:@"rtbufsize"];   //缓存
    [options setFormatOptionIntValue:2000000 forKey:@"analyzeduration"]; 
    [options setFormatOptionValue:@"nobuffer" forKey:@"fflags"];
    [options setFormatOptionIntValue:4096 forKey:@"probsize"];

这是楼主的一些配置参数。
3.4 IJKFFMoviePlayerController初始化

    self.player = [[IJKFFMoviePlayerController alloc] initWithContentURLString:_ipstring2 withOptions:options];        
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    self.player.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);  
    self.player.view.backgroundColor = [UIColor blackColor];
    self.player.scalingMode = IJKMPMovieScalingModeAspectFill; //缩放模式
    self.player.shouldAutoplay = YES; //开启自动播放(player准后后,自动播放)
    [self.view addSubview:self.player.view];// 添加拉流预览视图
    [self.player prepareToPlay];

3.5 添加观察者,监听拉流状态

    //监听网络状态改变
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateDidChange:) name:IJKMPMoviePlayerLoadStateDidChangeNotification object:self.player];
    //监听播放网络状态改变
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playStateDidChange:) name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];
//网络状态改变通知响应
- (void)loadStateDidChange:(NSNotification *)notification{
    IJKMPMovieLoadState loadState = self.player.loadState;
    if ((loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
        NSLog(@"LoadStateDidChange: 可以开始播放的状态: %d\n",(int)loadState);
    }else if ((loadState & IJKMPMovieLoadStateStalled) != 0) {
        NSLog(@"loadStateDidChange: IJKMPMovieLoadStateStalled: %d\n", (int)loadState);
    } else {
        NSLog(@"loadStateDidChange: ???: %d\n", (int)loadState);
    }
}
//播放状态改变通知响应
- (void)playStateDidChange:(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;
        }
    }
}

3.6 界面消失的时候,关闭播放器
[self.player stop];
[self.player shutdown];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容