iOS開發(fā)之直播(LFLiveKit推流+ijkplayer播放 + nginx/rmtp/ffmpeg服務器)

隨著移動開發(fā)中的直播越來越火爆惰聂,移動開發(fā)人員很多都來研究直播技術疆偿,深入了解就會明白咱筛,直播后面做的事情是非常復雜的,所以對技術要求是非常高的,當然本文不會講的很深入杆故,因為在下不才迅箩,技術很一般,我們只講直播的基本流程以方便大家理解处铛,直播總體分為2個大體流程:采集端將采集到的音視頻數(shù)據(jù)通過推流地址推送到服務器饲趋,播放端再通過拉流地址將音視頻數(shù)據(jù)拉到本地播放。涉及到3各方面:采集端(實時錄制)撤蟆、服務器(處理視頻)奕塑、播放端(播放視頻):

采集端

-音頻采集
-視頻采集
-音頻編碼壓縮
-視頻編碼壓縮

服務器

-數(shù)據(jù)分發(fā)CDN
-截屏:顯示主播畫面(第一幀預覽圖片)
-錄制視頻
-實時轉(zhuǎn)碼

播放端

-從FLV,TS中分離音視頻數(shù)據(jù)
-音視頻解碼
-播放

作為移動端開發(fā)人員其中涉及到的技術點如下圖所示:


直播技術.png

作為iOS開發(fā)人員枫疆,對于服務器的處理可以不用管爵川,采集和播放是iOS要做的,主要涉及到以下技術要點:

采集端技術

-AVFoundation框架:數(shù)據(jù)采集
-GPUImage框架:美顏處理
-FFmoeg框架:音頻壓縮
-libremp框架:推流
-服務器
-SNS
-BMS
-nginx

播放端技術

-ijkplayer框架:音視頻播放
-FFmpeg框架:視頻解碼
-VideoToolbox框架:視頻硬解碼
-AudioToolbox框架:音頻硬解碼

推流

-RTMP

拉流

-FLV
-RTMP
-HLS
這里很有必要解釋下息楔,我們這里的播放和采集不是我們自己寫的寝贡,當然我這樣的菜鳥是寫不出來的,但是已經(jīng)有牛逼的大神寫好了框架供我們使用,像采集端可以使用LFLiveKit,github地址:https://github.com/LaiFengiOS/LFLiveKit,這個框架里面自己寫好了采集視頻和推流過程值依,并且支持很多種的濾鏡美顏功能圃泡,方便開發(fā)者使用,播放視頻可以使用ijkplayer,是基于FFmpeg的跨平臺播放器框架,由B站開發(fā),目前已被多個主流直播App集成使用愿险,像著名的斗魚直播,當然了 這里不講這2個牛逼框架的代碼颇蜡,因為很多都是純C語言編寫的,我們只負責使用大神暴露給我們的接口辆亏。
因為我們的視頻音頻數(shù)據(jù)是要在服務器進行處理的风秤,所以我們講一下如何在自己電腦上搭建nginx 服務器(rtmp+ffmpeg框架):

安裝Homebrew

打開終端, 查看是否已經(jīng)安裝了Homebrew, 直接終端輸入命令

man brew

如果安裝成功,會出現(xiàn)很多提示幫助信息,此時輸入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/)

如果出現(xiàn)如下界面彻磁,nginx服務器就在你本機上安裝成功了:


nginx.png

如果出現(xiàn)端口占用問題, 輸入:

lsof -i tcp:8080

根據(jù)端口PID, kill掉(這兒的9603換成你自己8080端口的PID)

kill XXXX

然后重新輸入nginx 打開網(wǎng)址看是否啟動成功.

配置nginx和rtmp

查看nginxan安裝位置,輸入:

brew info nginx-full

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


nginx_location.png

賦值如下路徑, command + shift + G 然后command + V 進入這個nginx.conf文件位置,使用文本編輯打開,鼠標劃到最下面碍沐,添加下面代碼:

# 在http節(jié)點后面加上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

這里需要等待一會,網(wǎng)速不好的情況下建議翻墻,這個東東只有50多M,不會很久衷蜓,請耐心等待.
如下圖:


安裝ffmpeg.png

至此nginx + rtmp +ffmpeg已經(jīng)搭建好了:


安裝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

出現(xiàn)以上界面說明推流成功,可以使用VLC測試打開rtmp://localhost:1935/rtmplive/room并play就會出現(xiàn)剛才推到服務器上的視頻,在同一局域網(wǎng)下可以將localhost替換成服務器電腦的那個IP地址,錄制推流和試用ijkplayer播放都是基于這一個地址.
這里介紹一下集成ijkplayer打包靜態(tài)庫的打包過程:
首先下載ijkplayer:https://github.com/Bilibili/ijkplayer
進入終端 cd 到ijkplayer-mater文件夾,執(zhí)行命令

 ./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 (模擬器版本)然后 開始合并 在終端里面執(zhí)行

lipo -create "真機版本路徑" "模擬器版本路徑" -output "合并后的文件路徑"

至此你已經(jīng)生成了一個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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咆爽,一起剝皮案震驚了整個濱河市梁棠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斗埂,老刑警劉巖符糊,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呛凶,居然都是意外死亡男娄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門漾稀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來模闲,“玉大人,你說我怎么就攤上這事崭捍∈郏” “怎么了壹店?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵橄镜,是天一觀的道長火欧。 經(jīng)常有香客問我婴噩,道長,這世上最難降的妖魔是什么浩习? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任诗茎,我火速辦了婚禮拷姿,結果婚禮上匀们,老公的妹妹穿的比我還像新娘缴淋。我一直安慰自己,他們只是感情好昼蛀,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布宴猾。 她就那樣靜靜地躺著圆存,像睡著了一般叼旋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沦辙,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天夫植,我揣著相機與錄音,去河邊找鬼。 笑死详民,一個胖子當著我的面吹牛延欠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沈跨,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼由捎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饿凛?” 一聲冷哼從身側(cè)響起狞玛,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涧窒,沒想到半個月后心肪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡纠吴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年硬鞍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戴已。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡固该,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糖儡,到底是詐尸還是另有隱情蹬音,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布休玩,位于F島的核電站著淆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拴疤。R本人自食惡果不足惜永部,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呐矾。 院中可真熱鬧苔埋,春花似錦、人聲如沸蜒犯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罚随。三九已至玉工,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淘菩,已是汗流浹背遵班。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狭郑。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓腹暖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翰萨。 傳聞我的和親對象是個殘疾皇子脏答,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容