隨著移動開發(fā)中的直播越來越火爆惰聂,移動開發(fā)人員很多都來研究直播技術疆偿,深入了解就會明白咱筛,直播后面做的事情是非常復雜的,所以對技術要求是非常高的,當然本文不會講的很深入杆故,因為在下不才迅箩,技術很一般,我們只講直播的基本流程以方便大家理解处铛,直播總體分為2個大體流程:采集端將采集到的音視頻數(shù)據(jù)通過推流地址推送到服務器饲趋,播放端再通過拉流地址將音視頻數(shù)據(jù)拉到本地播放。涉及到3各方面:采集端(實時錄制)撤蟆、服務器(處理視頻)奕塑、播放端(播放視頻):
采集端
-音頻采集
-視頻采集
-音頻編碼壓縮
-視頻編碼壓縮
服務器
-數(shù)據(jù)分發(fā)CDN
-截屏:顯示主播畫面(第一幀預覽圖片)
-錄制視頻
-實時轉(zhuǎn)碼
播放端
-從FLV,TS中分離音視頻數(shù)據(jù)
-音視頻解碼
-播放
作為移動端開發(fā)人員其中涉及到的技術點如下圖所示:
作為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
接著輸入:
brew install nginx-full --with-rtmp-module
如下圖:
nginx就安裝成功了 ,接著輸入:
nginx
打開任意瀏覽器輸入地址啟動nginx服務器:
[http://localhost:8080](http://localhost:8080/)
如果出現(xiàn)如下界面彻磁,nginx服務器就在你本機上安裝成功了:
如果出現(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文件所在位置:
賦值如下路徑, 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,不會很久衷蜓,請耐心等待.
如下圖:
至此nginx + rtmp +ffmpeg已經(jīng)搭建好了:
我們可以使用命令行推一個小視頻試試看累提,進入終端輸入:
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
如下所示:
出現(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