iOS开发之直播(LFLiveKit推流+ijkplayer播放 + nginx/rmtp/ffmpeg服务器)

随着移动开发中的直播越来越火爆,移动开发人员很多都来研究直播技术,深入了解就会明白,直播后面做的事情是非常复杂的,所以对技术要求是非常高的,当然本文不会讲的很深入,因为在下不才,技术很一般,我们只讲直播的基本流程以方便大家理解,直播总体分为2个大体流程:采集端将采集到的音视频数据通过推流地址推送到服务器,播放端再通过拉流地址将音视频数据拉到本地播放。涉及到3各方面:采集端(实时录制)、服务器(处理视频)、播放端(播放视频):

采集端

-音频采集
-视频采集
-音频编码压缩
-视频编码压缩

服务器

-数据分发CDN
-截屏:显示主播画面(第一帧预览图片)
-录制视频
-实时转码

播放端

-从FLV,TS中分离音视频数据
-音视频解码
-播放

作为移动端开发人员其中涉及到的技术点如下图所示:


直播技术.png

作为iOS开发人员,对于服务器的处理可以不用管,采集和播放是iOS要做的,主要涉及到以下技术要点:

采集端技术

-AVFoundation框架:数据采集
-GPUImage框架:美颜处理
-FFmoeg框架:音频压缩
-libremp框架:推流
-服务器
-SNS
-BMS
-nginx

播放端技术

-ijkplayer框架:音视频播放
-FFmpeg框架:视频解码
-VideoToolbox框架:视频硬解码
-AudioToolbox框架:音频硬解码

推流

-RTMP

拉流

-FLV
-RTMP
-HLS
这里很有必要解释下,我们这里的播放和采集不是我们自己写的,当然我这样的菜鸟是写不出来的,但是已经有牛逼的大神写好了框架供我们使用,像采集端可以使用LFLiveKit,github地址:https://github.com/LaiFengiOS/LFLiveKit,这个框架里面自己写好了采集视频和推流过程,并且支持很多种的滤镜美颜功能,方便开发者使用,播放视频可以使用ijkplayer,是基于FFmpeg的跨平台播放器框架,由B站开发,目前已被多个主流直播App集成使用,像著名的斗鱼直播,当然了 这里不讲这2个牛逼框架的代码,因为很多都是纯C语言编写的,我们只负责使用大神暴露给我们的接口。
因为我们的视频音频数据是要在服务器进行处理的,所以我们讲一下如何在自己电脑上搭建nginx 服务器(rtmp+ffmpeg框架):

安装Homebrew

打开终端, 查看是否已经安装了Homebrew, 直接终端输入命令

man brew

如果安装成功,会出现很多提示帮助信息,此时输入Q退出即可,反之输入:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

等待一会,让它完成安装

安装nginx服务器

终端输入:

brew tap homebrew/nginx 
如果上面的命令被废弃了,就使用下面的命令:
brew tap denji/homebrew-nginx
nginx.png

接着输入:

brew install nginx-full --with-rtmp-module

如下图:


nginx安装.png

nginx就安装成功了 ,接着输入:

nginx

打开任意浏览器输入地址启动nginx服务器:

[http://localhost:8080](http://localhost:8080/)

如果出现如下界面,nginx服务器就在你本机上安装成功了:


nginx.png

如果出现端口占用问题, 输入:

lsof -i tcp:8080

根据端口PID, kill掉(这儿的9603换成你自己8080端口的PID)

kill XXXX

然后重新输入nginx 打开网址看是否启动成功.

配置nginx和rtmp

查看nginxan安装位置,输入:

brew info nginx-full

如图, 找到nginx.conf文件所在位置:


nginx_location.png

赋值如下路径, command + shift + G 然后command + V 进入这个nginx.conf文件位置,使用文本编辑打开,鼠标划到最下面,添加下面代码:

# 在http节点后面加上rtmp配置:
rtmp {
    server {
        listen 1935;
        application rtmplive {
            live on;
            record off;
        }
    }
}

接着重启nginx,输入

/usr/local/Cellar/nginx-full/1.12.1/bin/nginx -s reload

这里的1.1.1是nginx版本号.可以使用 nginx -v查看并替换

安装ffmpeg

进入终端输入以下命令:

brew install ffmpeg

这里需要等待一会,网速不好的情况下建议翻墙,这个东东只有50多M,不会很久,请耐心等待.
如下图:


安装ffmpeg.png

至此nginx + rtmp +ffmpeg已经搭建好了:


安装ffmpeg2.png

我们可以使用命令行推一个小视频试试看,进入终端输入:

ffmpeg -re -i 视频路径 -vcodec libx264 -acodec aac -strict -2 -f flv  rtmp://localhost:1935/rtmplive/room

比如: ffmpeg -re -i /Users/soung1314/Desktop/test.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/room
如下所示:

ffmpeg+nginx+rtmp推流.png

出现以上界面说明推流成功,可以使用VLC测试打开rtmp://localhost:1935/rtmplive/room并play就会出现刚才推到服务器上的视频,在同一局域网下可以将localhost替换成服务器电脑的那个IP地址,录制推流和试用ijkplayer播放都是基于这一个地址.
这里介绍一下集成ijkplayer打包静态库的打包过程:
首先下载ijkplayer:https://github.com/Bilibili/ijkplayer
进入终端 cd 到ijkplayer-mater文件夹,执行命令

 ./init-ios.sh

这一步是下载ffmpeg,接着cd 到ios目录,输入:

 ./compile-ffmpeg.sh clean 

然后输入:

./compile-ffmpeg.sh all

接着打包framework:
打开ijkmediaplayer.codePro这个工程,在framework那里点击edit Scheme,在build Configration那里选择Release 然后点击close 然后command + b编译一波,在products那里点击show in Finder,可以看到真机和模拟器两个版本的编译结果 一个是release-iPhones(真机) 一个是release-iPhonesiumulator (模拟器版本)然后 开始合并 在终端里面执行

lipo -create "真机版本路径" "模拟器版本路径" -output "合并后的文件路径"

至此你已经生成了一个framework,就是这个文件,可以直接拖入进你自己的项目中,并build一下,如果没报错,#import <IJKMediaFramework/IJKMediaFramework.h>,接着可以在你要播放的地方写代码了:

_player = [[IJKFFMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url]
                                                         withOptions:[IJKFFOptions optionsByDefault]];
    _player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    _player.view.frame = self.contentView.bounds;
    _player.scalingMode = IJKMPMovieScalingModeAspectFill;
    _player.shouldAutoplay = YES;
    [_player addObserver:self forKeyPath:@"playbackState" options:NSKeyValueObservingOptionNew context:nil];
    self.contentView.autoresizesSubviews = YES;
    [self.contentView addSubview:_player.view];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateDidChange:) name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:_player];
    [_player prepareToPlay];

采集推流

这里我们使用的是LFLiveKit这个牛逼的框架:https://github.com/LaiFengiOS/LFLiveKit,clone到本地,在LFLivePreview,m文件的最后面修改为

- (UIButton *)startLiveButton {
    if (!_startLiveButton) {
        _startLiveButton = [UIButton new];
        _startLiveButton.size = CGSizeMake(self.width - 60, 44);
        _startLiveButton.left = 30;
        _startLiveButton.bottom = self.height - 50;
        _startLiveButton.layer.cornerRadius = _startLiveButton.height/2;
        [_startLiveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [_startLiveButton.titleLabel setFont:[UIFont systemFontOfSize:16]];
        [_startLiveButton setTitle:@"开始直播" forState:UIControlStateNormal];
        [_startLiveButton setBackgroundColor:[UIColor colorWithRed:50 green:32 blue:245 alpha:1]];
        _startLiveButton.exclusiveTouch = YES;
        __weak typeof(self) _self = self;
        [_startLiveButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
            _self.startLiveButton.selected = !_self.startLiveButton.selected;
            if (_self.startLiveButton.selected) {
                [_self.startLiveButton setTitle:@"结束直播" forState:UIControlStateNormal];
                LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
                stream.url = @"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153";
                [_self.session startLive:stream];
            } else {
                [_self.startLiveButton setTitle:@"开始直播" forState:UIControlStateNormal];
                [_self.session stopLive];
            }
        }];
    }
    return _startLiveButton;
}

只要将nginx服务器的地址换为你自己搭建的nginx服务器地址即可(localhost改为自己电脑的ip地址), stream.url改为你自己的nginx服务器地址,配合VLC播放器就可以模拟直播采集和播放了

当然我们这里讲的只是基础流程,便于初学者更好的理解直播,由于本人技术有限,如果有写的不好的地方,望不吝赐教,如果您觉着对您理解直播有帮助,请伸出您宝贵的双手star我一波!
作者---mrChan1234

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

推荐阅读更多精彩内容